ArrayList
ArrayList - тип коллекции PowerShell, динамический массив, который может увеличиваться и уменьшаться по мере необходимости. С помощью ArrayLists можно легко добавлять, удалять, сортировать и обновлять элементы коллекции.
Обычный массив является статическим типом, в котором удаление и добавление элементов осуществляется за счёт создания нового массива.
Создание ArrayLists в PowerShell
Рекомендуемый способ
$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()
Добавление элементов в список PowerShell ArrayList
После создания списка 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
Чтобы обработать все элементы в 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 в своем сценарии PowerShell, есть несколько методов для манипулирования и изменения его элементов. Чтобы изменить значение элемента в ArrayList, вы можете использовать метод set_Item() или нотацию индекса массива. Например, чтобы обновить первый элемент, вы можете использовать
$ArrayList.set_Item(0, "Updated Element") #Another way $ArrayList[0] = "Updated Element".
Удаление элементов из списка массивов PowerShell
Удаление элементов из списка 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
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 и массивами
Вы можете легко конвертировать между ArrayList и стандартными массивами PowerShell:
Преобразование ArrayList в массив
Чтобы преобразовать список ArrayList в массив, используйте приведение типов как:
$Array = [array]$ArrayList
Вы также можете использовать метод ToArray():
$array = $arraylist.ToArray()
А как насчет обратного? Чтобы преобразовать существующий массив в ArrayList, используйте:
$arraylist = [System.Collections.ArrayList]$array
Массив или ArrayList автоматически приводится к целевому типу.
Преобразование PowerShell 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
Вы можете фильтровать элементы в 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}
Экспорт списка массивов в CSV
Допустим, у вас есть такой список 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
PowerShell Импорт CSV в список массивов
Вы можете импортировать 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
При работе с PowerShell ArrayList вы можете столкнуться с некоторыми распространенными ошибками или проблемами. В этом разделе мы обсудим некоторые из этих ошибок и дадим советы по их устранению и решению.
- Индекс вне диапазона: Эта ошибка возникает, когда вы пытаетесь получить доступ или изменить элемент с индексом, который не существует в списке ArrayList. Чтобы избежать этой ошибки, всегда убеждайтесь, что используемый индекс находится в пределах границ ArrayList. Вы можете использовать свойство Count, чтобы получить количество элементов в ArrayList.
- InvalidCastException: Эта ошибка возникает, когда вы пытаетесь преобразовать элемент в ArrayList к несовместимому типу данных. Чтобы исправить эту ошибку, убедитесь, что вы используете правильный тип данных для данного элемента, или воспользуйтесь соответствующими методами преобразования, предоставляемыми PowerShell и .NET Framework.
- Добавление элементов с разными типами данных: Хотя в списке ArrayList можно хранить элементы с разными типами данных, это может привести к неожиданному поведению и проблемам с производительностью. Чтобы избежать этого, старайтесь использовать единый тип данных для всех элементов в ArrayList или рассмотрите возможность использования другого типа коллекции, например Hashtable или пользовательского объекта.
Реальные применения PowerShell ArrayList
PowerShell ArrayList можно использовать в различных реальных сценариях, таких как:
- Обработка файлов журналов: ArrayList можно использовать для хранения и обработки данных файла журнала, что позволяет эффективно фильтровать, сортировать и анализировать записи журнала.
- Управление запасами: PowerShell ArrayList можно использовать для хранения и управления данными инвентаризации, такими как имена компьютеров, IP-адреса и сведения об оборудовании.
- Обработка данных: ArrayList можно использовать в задачах обработки данных, таких как разбор CSV-файлов, обработка XML-данных или работа с объектами JSON.
- Оптимизация сценариев: Как уже упоминалось, использование ArrayList может помочь повысить производительность сценариев PowerShell, что делает его ценным инструментом для задач оптимизации сценариев.
- Хранение упорядоченных коллекций, например списков серверов, пользователей и т. д., которые часто меняются.
- Сбор результатов циклов и конвейеров перед экспортом в CSV
Заключение
Списки массивов представляют собой мощную альтернативу стандартным массивам PowerShell для хранения динамических коллекций.
Если вы хотите узнать больше о PowerShell ArrayList и других темах PowerShell, изучите следующие ресурсы: