Array.Add vs + =

时间:2013-01-31 07:10:37

标签: arrays powershell

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

$array = @()

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

  

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

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

为什么会这样?

3 个答案:

答案 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

如果无法做到这一点,请考虑使用效率更高的集合,例如ListArrayList(参见其他答案)。

答案 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