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()