我在PowerShell Arrays中发现了一些有趣的行为,即如果我将数组声明为:
$array = @()
然后尝试使用$array.Add("item")
方法向其添加项目,我收到以下错误:
使用“1”参数调用“添加”的异常:“集合具有固定大小。”
但是,如果我使用$array += "item"
附加项目,则会毫无问题地接受该项目,并且“固定大小”限制似乎不适用。
为什么会这样?
答案 0 :(得分:210)
使用$array.Add()
- 方法时,您尝试将元素添加到现有数组中。数组是固定大小的集合,因此您将收到错误,因为它无法扩展。
$array += $element
创建一个 new 数组,其元素与旧项目+新项目相同,而这个新的较大数组替换$array
- 变量<中的旧数组/ p>
您可以使用+ =运算符向数组添加元素。当你 使用 它,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
或ArrayList
(参见其他答案)。
答案 1 :(得分:93)
如果你想要一个动态大小的数组,那么你应该制作一个列表。你不仅会获得.Add()
功能,而且正如@ frode-f所解释的那样,无论如何它的内存效率更高,也更好。
它很容易使用。
代替你的数组声明,试试这个:
$outItems = New-Object System.Collections.Generic.List[System.Object]
添加项目很简单。
$outItems.Add(1)
$outItems.Add("hi")
如果你在完成时真的想要一个数组,那么它也有一个功能。
$outItems.ToArray()
答案 2 :(得分:1)
在不使用低效+=
的情况下创建数组的最常见习惯是从循环输出中得出的:
$array = foreach($i in 1..10) {
$i
}
$array