PowerShell Array.Add vs + =
Я нашел некоторое интересное поведение в массивах PowerShell, а именно, если я объявляю массив как:
$array = @()
И затем попытайтесь добавить элементы к нему с помощью метода $array.Add("item")
, я получаю следующую ошибку:
Exception calling "Add" with "1" argument(s): "Collection was of a fixed size."
Однако, если я добавляю элементы, используя $array += "item"
, элемент принимается без проблем, и ограничение "фиксированного размера", похоже, не применяется.
Почему это?
Ответы
Ответ 1
Когда вы используете метод $array.Add()
, вы пытаетесь добавить элемент в массив. Массив представляет собой набор фиксированного размера, поэтому вы получите сообщение об ошибке.
Когда вы используете $array += $element
, PS создает новый массив с теми же элементами, что и $array
+, который вы добавляете, а затем перезаписывает оригинал. Вы видите разницу? Первый метод попытался изменить/расширить исходный массив, в то время как этот подход просто копирует все элементы в новый темп. массив и перезаписывает старый в $array
-variable.
Вы можете использовать оператор + = для добавления элемента в массив. Когда ты использование он, Windows PowerShell фактически создает новый массив со значениями исходный массив и добавленную стоимость. Например, чтобы добавить элемент с значение 200 для массива в переменной $a, введите:
$a += 200
Источник: about_Arrays
Ответ 2
Если вам нужен массив с динамическим размером, вы должны составить список. Мало того, что вы получите .Add()
функциональность, но, как объясняет @frode-f, в любом случае это повышает эффективность памяти и лучшую практику.
И он настолько прост в использовании.
Вместо объявления массива попробуйте следующее:
$outItems = New-Object System.Collections.Generic.List[System.Object]
Добавление элементов просто.
$outItems.Add(1)
$outItems.Add("hi")
И если вам действительно нужен массив, когда вы закончите, там тоже будет функция.
$outItems.ToArray()