ArrayList

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

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

Рекомендуемый способ

$arrayList = [System.Collections.ArrayList]::new()
$arrayList.Add("value")

Старый, но рабочий способ.

$arrayList = New-Object -TypeName System.Collections.ArrayList
 
#Список со 100 элементами
$ArrayList = New-Object -TypeName System.Collections.ArrayList -ArgumentList 100

Приведение обычного массива к ArrayList

$array = @(1, 2, 3)
$arrayList = [System.Collections.ArrayList]$array

⚠️ Но: это не создаёт настоящий ArrayList, а просто «оборачивает» массив — не всегда работает как полноценный ArrayList. Лучше использовать ::new().

$ArrayList = [System.Collections.ArrayList]@("Banana", "Cherry", "Apple","Orange")

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

$Employee = New-Object System.Collections.ArrayList
$Employee.Add(001)
$Employee.Add("Steve Johnson")
$Employee.Add([DateTime]"01/01/2021")
$arrayList.Add("one")
$arrayList.Remove("one")
$arrayList.Insert(0, "zero")
$arrayList.Sort()

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

$ArrayList.Add("Berry")

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

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

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

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

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

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

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

$arrayList.Insert(0, "Plums")

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

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

$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:

$ArrayList.Count

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

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

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

$LastItem = $ArrayList[-1]

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

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

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

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

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

 $ArrayList | ForEach-Object {
 Write-Host $_
}

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

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

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

МетодОписание
$arrayList.Remove("banana")Удаляет первое вхождение указанного элемента, удалит ПЕРВОЕ "banana"
RemoveRange(0,1)Удаляет заданное количество элементов, начиная с указанного индекса, Удалит 1 элемент, начиная с индекса 0
RemoveAt(1)Удаляет элемент по заданному индексу,Удалит элемент по индексу 1

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

$arrayList = [System.Collections.ArrayList]@("apple", "banana", "cherry", "banana")
$arrayList.Remove("apple")
$arrayList

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

$arrayList = [System.Collections.ArrayList]@("apple", "banana", "cherry", "banana")
$ArrayList.RemoveAt(3)
$arrayList

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

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

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

$ArrayList.Clear()

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

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

$ArrayList.Sort()

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

$ArrayList.Sort()
$ArrayList.Reverse()

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

$SortedArrayList = $ArrayList | Sort-Object

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

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

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

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

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

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

$Array = [array]$ArrayList

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

$array = $arraylist.ToArray()

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

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

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

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

$string = $arrayList -join ', '

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

При работе с 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. Хранение упорядоченных коллекций, например списков серверов, пользователей и т. д., которые часто меняются.
  6. Сбор результатов циклов и конвейеров перед экспортом в CSV

Списки массивов представляют собой мощную альтернативу стандартным массивам PowerShell для хранения динамических коллекций.

Если вы хотите узнать больше о PowerShell ArrayList и других темах PowerShell, изучите следующие ресурсы: