ArrayList

ArrayList - тип коллекции PowerShell, динамический массив, который может увеличиваться и уменьшаться по мере необходимости. С помощью ArrayLists можно легко добавлять, удалять, сортировать и обновлять элементы коллекции.

Обычный массив является статическим типом, в котором удаление и добавление элементов осуществляется за счёт создания нового массива.

    $arrayList = New-Object -TypeName System.Collections.ArrayList

или

    $ArrayList = [System.Collections.ArrayList]::new()
 
    #Список со 100 элементами
    $ArrayList = New-Object -TypeName System.Collections.ArrayList -ArgumentList 100
    $ArrayList = [System.Collections.ArrayList]@("Banana", "Cherry", "Apple","Orange")

В отличие от массива по умолчанию, ArrayList может содержать различные типы данных. Например, допустим, вы хотите создать массив ArrayList "Employee" со значениями Employee Number, Employee Name и Date of Join:

1	$Employee = New-Object System.Collections.ArrayList
2	$Employee.Add(001)
3	$Employee.Add("Steve Johnson")
4	$Employee.Add([DateTime]"01/01/2021")

После создания списка ArrayList добавлять элементы в список PowerShell ArrayList очень просто с помощью встроенного метода Add(). Этот метод позволяет добавить один элемент в конец списка ArrayList:

1	$ArrayList.Add("Berry")

В качестве альтернативы можно использовать метод AddRange() для ArrayList с набором начальных значений.

1	$Fruits = @("Banana", "Cherry", "Date")
2	$ArrayList.AddRange($Fruits)

Например, чтобы создать список ArrayList, содержащий числа от 1 до 5, вы можете использовать следующий код:

1	$initialValues = 1..5
2	$arrayList = New-Object -TypeName System.Collections.ArrayList
3	$arrayList.AddRange($initialValues)

Вот еще один способ добавить несколько элементов в список массива с помощью цикла:

1	#Create a Array List
2	$ArrayList = New-Object System.Collections.ArrayList
3	 
4	#Add Elements to Array List
5	@(0..100).ForEach({$ArrayList.Add($_)})

Кроме того, метод Insert() можно использовать для вставки элемента по определенному индексу в ArrayList:

    1	$arrayList.Insert(0, "Plums")

Этот код вставит "Plums" в начало списка ArrayList (индекс 0). Помните, что индекс начинается с нуля, то есть первый элемент имеет индекс 0, второй элемент - 1 и так далее.

Вы можете использовать метод GetType() для получения типа данных элемента, хранящегося в ArrayList. Например,

     1	$ArrayList[0].GetType().Name

Добавление в список $MyDatabase строку/объект в формате

Name    All  F1  F2  F3  #Названия полей
Первый   4    1   0   0
 
$null = $MyDatabase.Add(
          [pscustomobject] @{Name=$MyItem.Name;  All=$MyItem.Count;  F1=1; F2=0;F3=0 }
 
 
[void].$ArrayList.Add($ArrayItem)
$null = $ArrayList.Add($ArrayItem)

Чтобы получить количество элементов в ArrayList:

1	$ArrayList.Count

Чтобы получить элемент по индексу:

1	$item1 = $Arraylist[0]
2	$item2 = $Arraylist[1]

Вы можете получить доступ к элементам так же, как и к стандартному массиву PowerShell. Чтобы получить последний элемент:

1	$LastItem = $ArrayList[-1]

Чтобы обработать все элементы в ArrayList, используйте Foreach:

ForEach ($Element in $ArrayList) {
 # Do something with $Element
  Write-Output $Element
 }

При этом происходит последовательный перебор каждого элемента. Вы также можете использовать цикл for с Count:

1	For($i=0; $i -lt $Arraylist.Count; $i++) {
2	  # Do something with $element
3	  $element = $arraylist[$i]
4	  Write-host $Element
5	}

Вот еще одна форма:

1	$ArrayList | ForEach-Object {
2	    Write-Host $_
3	}

Если вы создали список ArrayList в своем сценарии PowerShell, есть несколько методов для манипулирования и изменения его элементов. Чтобы изменить значение элемента в ArrayList, вы можете использовать метод set_Item() или нотацию индекса массива. Например, чтобы обновить первый элемент, вы можете использовать

1	$ArrayList.set_Item(0, "Updated Element") 
2	 
3	#Another way
4	$ArrayList[0] = "Updated Element".

Более сложные техники манипулирования, такие как сортировка, реверсирование и поиск, мы рассмотрим в одном из следующих разделов этой статьи.

Удаление элементов из списка PowerShell ArrayList - это распространенная операция, которую можно выполнить с помощью методов

  • Remove()
  • RemoveRange()
  • RemoveAt()

Независимо от того, хотите ли вы удалить конкретный элемент, несколько элементов или даже очистить весь список, существует метод, который поможет вам сделать именно это. Вот как это делается: Метод Remove() удаляет первое вхождение указанного элемента, а метод RemoveAt() удаляет элемент по определенному индексу.

Например, чтобы удалить первое вхождение элемента "apple" из списка ArrayList, вы можете использовать следующий код:

1 $arrayList.Remove("apple")

Обратите внимание, что приведенный выше метод Remove чувствителен к регистру. Чтобы удалить элемент с индексом 3, можно использовать следующий код:

1 $ArrayList.RemoveAt(3)

Метод RemoveRange позволяет удалить диапазон элементов, указав начальный индекс и количество элементов для удаления:

    1	$ArrayList.RemoveRange(0,2)  # This will remove the first two elements

Чтобы удалить все элементы из списка ArrayList, используйте метод Clear():

     1	$ArrayList.Clear()

Clear() очищает весь список ArrayList. Помните, что эти методы изменяют исходный объект Array List, поэтому используйте их с осторожностью и убедитесь, что вы удаляете правильные элементы.

PowerShell ArrayList предоставляет несколько методов для манипулирования и обработки данных, таких как сортировка, разворот и поиск. Для сортировки списка ArrayList можно использовать встроенный метод Sort(). Например, чтобы отсортировать список ArrayList чисел по возрастанию, можно использовать следующий код:

1	$ArrayList.Sort()

Чтобы отсортировать список ArrayList строк по убыванию, можно использовать следующий код:

1	$ArrayList.Sort()
2	$ArrayList.Reverse()

Этот код сначала отсортирует ArrayList по возрастанию, а затем изменит порядок, чтобы получить элементы в порядке убывания. Команда Sort-Object также может быть использована для сортировки элементов в массиве:

1	$SortedArrayList = $ArrayList | Sort-Object

Для поиска элемента в ArrayList можно использовать метод Contains(). Например, чтобы проверить, содержит ли ArrayList элемент "apple", вы можете использовать следующий код:

1	if ($ArrayList.Contains("apple")) {
2	    Write-Host "ArrayList contains 'apple'"
3	}

Этот код проверит, содержит ли ArrayList элемент "apple", и выведет сообщение, если содержит.

 $MyItemID=[Array]::IndexOf(Список, Подстрока поиска)

Вы можете легко конвертировать между ArrayList и стандартными массивами PowerShell:

Чтобы преобразовать список ArrayList в массив, используйте приведение типов как:

1	$Array = [array]$ArrayList

Вы также можете использовать метод ToArray():

1	$array = $arraylist.ToArray()

А как насчет обратного? Чтобы преобразовать существующий массив в ArrayList, используйте:

1	$arraylist = [System.Collections.ArrayList]$array

Массив или ArrayList автоматически приводится к целевому типу.

Могут возникнуть ситуации, когда вам необходимо преобразовать список PowerShell ArrayList в строку. Это можно легко сделать с помощью оператора -join или метода String.Join(). Например, чтобы преобразовать список строк ArrayList в одну строку, разделенную запятыми, можно использовать следующий код:

1	$string = $arrayList -join ', '

Или с помощью метода String.Join():

1	$string = [System.String]::Join(', ', $arrayList)

Оба метода создадут новую строку, содержащую элементы списка ArrayList, разделенные указанным разделителем (в данном случае запятой и пробелом).

Чтобы объединить несколько списков ArrayLists:

1	$arraylist1 = [System.Collections.ArrayList]@(1, 2, 3)
2	$arraylist2 = [System.Collections.ArrayList]@(4, 5, 6)
3	 
4	$result = $arraylist1.Clone()
5	$result.AddRange($arraylist2)

Clone() создает копию перед добавлением $arraylist2, чтобы избежать изменения оригинала.

Вы можете фильтровать элементы в ArrayList с помощью метода Where:

1	#Create a Array List with values: 1 to 10
2	$Values = 1..10
3	$ArrayList = New-Object -TypeName System.Collections.ArrayList
4	$ArrayList.AddRange($Values)
5	 
6	#Filter Array List
7	$Arraylist = $ArrayList.Where{$_ -ge 5}

Кроме того, для фильтрации элементов массива можно использовать команду Where-Object:

1	#Filter ArrayList
2	$MyArraylist = $ArrayList | Where-Object {$_ -ge 5}

Допустим, у вас есть такой список ArrayList

1	$ArrayList = New-Object System.Collections.ArrayList
2	$ArrayList.Add("Apple")
3	$ArrayList.Add("Banana")
4	$ArrayList.Add("Cherry")

Проблема заключается в том, что этот ArrayList содержит простые строковые данные, а Export-Csv ожидает объекты со свойствами. Чтобы решить эту проблему, можно создать собственный массив объектов из этих простых типов данных, например:

1	#Convert ArrayList to Object array
2	$Objects = $ArrayList | ForEach-Object { [PSCustomObject]@{Fruit = $_} }
3	 
4	#Export Array to CSV
5	$Objects | Export-Csv -Path "C:\Temp\Fruits.csv" -NoTypeInformation

Вы можете импортировать CSV-файл в список ArrayList с помощью Import-Csv и цикла ForEach.

1	$csvData = Import-Csv -Path 'C:\Temp\Fruits.csv'
2	$ArrayList = New-Object System.Collections.ArrayList
3	 
4	ForEach ($row in $csvData) {
5	    $ArrayList.Add($row)
6	}

При работе с PowerShell ArrayList вы можете столкнуться с некоторыми распространенными ошибками или проблемами. В этом разделе мы обсудим некоторые из этих ошибок и дадим советы по их устранению и решению.

  1. Индекс вне диапазона: Эта ошибка возникает, когда вы пытаетесь получить доступ или изменить элемент с индексом, который не существует в списке ArrayList. Чтобы избежать этой ошибки, всегда убеждайтесь, что используемый индекс находится в пределах границ ArrayList. Вы можете использовать свойство Count, чтобы получить количество элементов в ArrayList.
  2. InvalidCastException: Эта ошибка возникает, когда вы пытаетесь преобразовать элемент в ArrayList к несовместимому типу данных. Чтобы исправить эту ошибку, убедитесь, что вы используете правильный тип данных для данного элемента, или воспользуйтесь соответствующими методами преобразования, предоставляемыми PowerShell и .NET Framework.
  3. Добавление элементов с разными типами данных: Хотя в списке ArrayList можно хранить элементы с разными типами данных, это может привести к неожиданному поведению и проблемам с производительностью. Чтобы избежать этого, старайтесь использовать единый тип данных для всех элементов в ArrayList или рассмотрите возможность использования другого типа коллекции, например Hashtable или пользовательского объекта.

PowerShell ArrayList можно использовать в различных реальных сценариях, таких как:

  1. Обработка файлов журналов: ArrayList можно использовать для хранения и обработки данных файла журнала, что позволяет эффективно фильтровать, сортировать и анализировать записи журнала.
  2. Управление запасами: PowerShell ArrayList можно использовать для хранения и управления данными инвентаризации, такими как имена компьютеров, IP-адреса и сведения об оборудовании.
  3. Обработка данных: ArrayList можно использовать в задачах обработки данных, таких как разбор CSV-файлов, обработка XML-данных или работа с объектами JSON.
  4. Оптимизация сценариев: Как уже упоминалось, использование ArrayList может помочь повысить производительность сценариев PowerShell, что делает его ценным инструментом для задач оптимизации сценариев.
  5. Хранение упорядоченных коллекций, например списков серверов, пользователей и т. д., которые часто меняются.

Сбор результатов циклов и конвейеров перед экспортом в CSV

Списки массивов представляют собой мощную альтернативу стандартным массивам PowerShell для хранения динамических коллекций. В этом подробном руководстве мы рассмотрели основные принципы работы со списками массивов PowerShell, от создания и манипулирования до устранения распространенных ошибок этой фантастической структуры данных. Мы также рассмотрели реальные примеры использования и дали советы по оптимизации производительности сценариев. Поняв особенности и преимущества ArrayList, вы сможете легко хранить данные и манипулировать ими динамично и эффективно.

Теперь, когда вы хорошо знаете, что такое ArrayList в PowerShell, пришло время применить полученные знания на практике и начать оптимизировать свои сценарии. Не забывайте следовать лучшим практикам и использовать встроенные методы, предоставляемые ArrayList, чтобы получить максимальную отдачу от ваших сценариев PowerShell.