我在 PowerShell 数组中发现了一些有趣的行为,即,如果我将数组声明为:
$array = @()
然后尝试使用该$array.Add("item")
方法向其中添加项目,我收到以下错误:
使用“1”参数调用“添加”的异常:“集合具有固定大小。”
但是,如果我使用 附加项目$array += "item"
,则该项目被接受而没有问题,并且“固定大小”限制似乎不适用。
为什么是这样?
我在 PowerShell 数组中发现了一些有趣的行为,即,如果我将数组声明为:
$array = @()
然后尝试使用该$array.Add("item")
方法向其中添加项目,我收到以下错误:
使用“1”参数调用“添加”的异常:“集合具有固定大小。”
但是,如果我使用 附加项目$array += "item"
,则该项目被接受而没有问题,并且“固定大小”限制似乎不适用。
为什么是这样?
使用$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
如果这不可能,请考虑使用更有效的集合,例如List
or 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