211

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

$array = @()

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

使用“1”参数调用“添加”的异常:“集合具有固定大小。”

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

为什么是这样?

4

3 回答 3

293

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

$array += $element创建一个$array数组,其元素与旧数组 + 新项相同,并且这个新的更大数组替换 -变量中的旧数组

您可以使用 += 运算符将元素添加到数组中。当您使用它时,Windows PowerShell 实际上会使用原始数组的值和添加的值创建一个新数组。例如,要将值为 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

如果这不可能,请考虑使用更有效的集合,例如Listor ArrayList(请参阅其他答案)。

于 2013-01-31T07:19:11.650 回答
138

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

它非常易于使用。

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

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

添加项目很简单。

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

如果你在完成后真的想要一个数组,那么也有一个函数。

$outItems.ToArray()
于 2015-10-15T18:48:47.710 回答
13

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

$array = foreach($i in 1..10) { 
  $i
}
$array
[collections.arraylist]$array = 1..10
$array.add(11) > $null
于 2019-11-04T20:52:53.780 回答