211

PowerShell 配列で興味深い動作を見つけました。つまり、配列を次のように宣言した場合です。

$array = @()

メソッドを使用して項目を追加しようとすると$array.Add("item")、次のエラーが表示されます。

"1" 個の引数を指定して "Add" を呼び出し中に例外が発生しました: "コレクションは固定サイズでした。"

しかし、 を使ってアイテムを追加する$array += "item"と、アイテムは問題なく受け入れられ、「固定サイズ」の制限は適用されないようです。

どうしてこれなの?

4

3 に答える 3

293

-methodを使用する場合$array.Add()、要素を既存の配列に追加しようとしています。配列は固定サイズのコレクションであるため、拡張できないためエラーが発生します。

$array += $element古いものと同じ要素+新しいアイテムで新しい配列を作成し、この新しい大きな配列が$array-variableの古い配列を置き換えます

+ =演算子を使用して、要素を配列に追加できます。これを使用すると、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ください(他の回答を参照してください)。

于 2013-01-31T07:19:11.650 に答える
138

動的なサイズの配列が必要な場合は、リストを作成する必要があります。機能が得られるだけ.Add()でなく、@frode-f が説明しているように、動的配列はよりメモリ効率が高く、とにかくより良い方法です。

そして、それはとても使いやすいです。

配列宣言の代わりに、これを試してください:

$outItems = New-Object System.Collections.Generic.List[System.Object]

アイテムの追加は簡単です。

$outItems.Add(1)
$outItems.Add("hi")

完成したときに本当に配列が必要な場合は、そのための関数もあります。

$outItems.ToArray()
于 2015-10-15T18:48:47.710 に答える