Array.Add vs + =

mal*_*gca 162 arrays powershell

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

$array = @()
Run Code Online (Sandbox Code Playgroud)

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

使用"1"参数调用"Add"的异常:"Collection具有固定大小."

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

为什么是这样?

Fro*_* F. 231

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

$array += $element创建一个元素,其元素与旧元素+新元素相同,这个新的大型数组替换$array-variable中的旧数组

您可以使用+ =运算符将元素添加到数组中.使用它时,Windows PowerShell实际上会创建一个新数组,其中包含原始数组的值和添加的值.例如,要向$ a变量中的数组添加值为200的元素,请键入:

    $a += 200
Run Code Online (Sandbox Code Playgroud)

来源:about_Arrays

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

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

$arr.Count
5
Run Code Online (Sandbox Code Playgroud)

如果那是不可能的,请考虑使用更有效的集合,List或者ArrayList(参见其他答案).

  • 这是完全正确的,大型阵列效率低下,不幸的是,你必须使用不同的类型:http://powershell.org/wp/2013/09/16/powershell-performance-the-operator-and-当对避免-IT /评论页-1 / (5认同)
  • 因为它继承自`IList`.尝试`Get-Member -InputObject @()`将显示这个`Add Method int IList.Add(System.Object value)` (3认同)
  • 这取决于.如果要添加和删除大量成员,请尝试`List`或`ArrayList`.它们会快得多.我个人在99%的时间内使用`+ =`和数组,因为我通常会创建短暂的抛弃脚本,其中额外的秒数无关紧要.对于有大量添加/删除的大脚本我想要优化并节省时间我使用`List`或`ArrayList`. (2认同)
  • 由于数组总是固定大小,有没有人知道为什么存在`Add()`方法? (2认同)
  • 所以他们有`.Add()`,因为他们实现了IList,但它不起作用,因为他们是`.IsFixedSize`。那么为什么它们是固定大小的呢?为什么 IList 有一个属性来检查固定大小的列表事物? (2认同)

小智 104

如果你想要一个动态大小的数组,那么你应该创建一个列表.你不仅会获得.Add()功能,而且正如@ frode-f所解释的那样,无论如何它的内存效率更高,更好.

而且它很容易使用.

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

$outItems = New-Object System.Collections.Generic.List[System.Object]
Run Code Online (Sandbox Code Playgroud)

添加项目很简单.

$outItems.Add(1)
$outItems.Add("hi")
Run Code Online (Sandbox Code Playgroud)

如果你在完成时真的想要一个数组,那么它也有一个功能.

$outItems.ToArray()
Run Code Online (Sandbox Code Playgroud)

  • @Preza8:`(New-Object System.Collections.Generic.List[string]).GetType().Name` 为我产生了`List\`1`,正如预期的那样;也许您将 `+=` 应用于包含列表的变量(而不是调用 `.Add()` 方法),在这种情况下,变量值确实会被转换为数组(`System.Object[]`)。 (2认同)

js2*_*010 6

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

$array = foreach($i in 1..10) { 
  $i
}
$array
Run Code Online (Sandbox Code Playgroud)

  • 我真的很喜欢这种方法。它更加简洁,但又不失意图/清晰度 (2认同)