我在PowerShell数组中发现了一些有趣的行为,即,如果我声明一个数组为:

$array = @()

然后尝试使用$array.Add("item")方法向它添加项目,我收到以下错误:

调用带有“1”参数的“Add”异常:“集合的大小是固定的。”

然而,如果我使用$array += "item"附加项目,项目被接受没有问题,“固定大小”限制似乎不适用。

为什么会这样?


当使用$array. add()方法时,您正在尝试将元素添加到现有数组中。数组是固定大小的集合,因此您将收到一个错误,因为它不能扩展。

$array += $element创建一个新数组,其元素与旧数组+新项目相同,这个新的更大的数组将取代$array-变量中的旧数组

可以使用+=运算符向数组中添加元素。当你 使用 的值创建了一个新数组 原始数组和附加值。例如,使用 值200到$a变量中的数组,输入: $a += 200

来源:about_Arrays

+=是一个昂贵的操作,所以当你需要添加很多项时,你应该尝试在尽可能少的操作中添加它们,例如:

$arr = 1..3    #Array
$arr += (4..5) #Combine with another array in a single write-operation

$arr.Count
5

如果这是不可能的,考虑使用更有效的集合,如List或ArrayList(见另一个答案)。


如果你想要一个动态大小的数组,那么你应该创建一个列表。您不仅可以获得. add()功能,而且正如@frode-f所解释的那样,动态数组更节省内存,无论如何都是一种更好的实践。

而且它很容易使用。

而不是你的数组声明,试试这个:

$outItems = New-Object System.Collections.Generic.List[System.Object]

添加项目很简单。

$outItems.Add(1)
$outItems.Add("hi")

如果你完成后真的想要一个数组,这里也有一个函数。

$outItems.ToArray()

在不使用低效的+=的情况下创建数组的最常见的习语是这样的,来自循环的输出:

$array = foreach($i in 1..10) { 
  $i
}
$array

添加到一个已经存在的数组:

[collections.arraylist]$array = 1..10
$array.add(11) > $null