Arrays 数组。添加vs+=

Arrays 数组。添加vs+=,arrays,powershell,Arrays,Powershell,我在PowerShell数组中发现了一些有趣的行为,即,如果我将数组声明为: $array = @() 然后尝试使用$array.add(“item”)方法向其中添加项目,我收到以下错误: 使用“1”参数调用“Add”时出现异常:“集合大小固定。” 但是,如果我使用$array+=“item”附加项,则该项将被毫无问题地接受,“固定大小”限制似乎不适用 这是为什么?使用$array.Add()-方法时,您试图将元素添加到现有数组中。数组是固定大小的集合,因此您将收到一个错误,因为它无法扩展 $

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

$array = @()
然后尝试使用
$array.add(“item”)
方法向其中添加项目,我收到以下错误:

使用“1”参数调用“Add”时出现异常:“集合大小固定。”

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


这是为什么?

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

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

可以使用+=运算符将元素添加到数组中。当你 使用 实际上,Windows PowerShell创建了一个新数组,其值为 原始数组和附加值。例如,添加具有 $a变量中数组的值为200,键入:

    $a += 200
资料来源:

+=
是一项昂贵的操作,因此当您需要添加许多项时,应尝试在尽可能少的操作中添加它们,例如:

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

$arr.Count
5

如果这是不可能的,考虑使用一个更有效的集合,如<代码>清单>代码>或<代码> ARARYLIST/COM>(参见另一个答案)。

< P>如果你想要一个动态大小的数组,那么你应该做一个列表。您不仅可以获得
.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

谢谢:)我想可能是这样的,但我认为使用大型阵列效率会很低,所以powershell团队正在做一些不同的事情。这取决于具体情况。如果要添加和删除大量成员,请选择“是”,然后尝试
List
ArrayList
。他们会快得多。我个人99%的时间都在使用
+=
和数组,因为我通常会创建简短的一次性脚本,而额外的秒数并不重要。对于包含大量添加/删除的大型脚本,为了优化和节省时间,我使用了
List
ArrayList
。由于数组的大小总是固定的,有人知道为什么会存在
add()
方法吗?因为它是从
IList
继承的。尝试
Get Member-InputObject@()
将在IList.Add(System.Object value)中显示此
Add方法,因此它们有
.Add()
,因为它们实现了IList,但它不起作用,因为它们是
。IsFixedSize
。那么为什么它们是固定大小的??为什么IList有一个属性来检查固定大小的列表?我已经尝试过了。我使用新的对象System.Collections.Generic.List[string]创建它,但是如果我使用.GetType,它会告诉我它是一个数组。您是否尝试过使用
Add()
函数?我可以确认,如果您如上所述创建一个通用的
列表
对象,那么您有一个可变列表,您可以分别使用
add()
remove()
方法为其添加和删除项。@Preza8:
(新对象系统.Collections.generic.List[string]).GetType().Name
为我生成
List`1
,如期而至;也许您将
+=
应用于包含列表的变量(而不是调用
.Add()
方法),在这种情况下,变量值确实会转换为数组(
System.Object[]
)。快捷方式:
$a=新对象集合。generic.list[Object]
相关:我非常喜欢这种方法。它更加简洁而不失意图/清晰