web-dev-qa-db-ja.com

Array.Addと+ =

私はPowerShellの配列にいくつかの興味深い振る舞いを見いだしました。

$array = @()

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

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

ただし、$array += "item"を使用してアイテムを追加した場合、そのアイテムは問題なく受け入れられ、「固定サイズ」の制限は適用されません。

どうしてこれなの?

148
malgca

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

$array += $elementは、古いものと同じ要素+新しい項目を持つ新しい配列を作成し、この新しい大きい配列は、$array-変数内の古いものを置き換えます

配列に要素を追加するために+ =演算子を使うことができます。使用すると、Windows PowerShellは実際には元の配列の値と追加された値を使用して新しい配列を作成します。たとえば、$ a変​​数の配列に200の値を持つ要素を追加するには、次のように入力します。

    $a += 200

出典: about_Arrays

+=は高価な操作なので、たくさんの項目を追加する必要があるときは、できるだけ少ない操作でそれらを追加するようにしてください。

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

$arr.Count
5

それが不可能な場合は、ListArrayListのようなもっと効率的なコレクションを使うことを検討してください(他の答えを見てください)。

213
Frode F.

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

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

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

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

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

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

そして、終わったときに本当に配列が欲しいのなら、そのための関数もあります。

$outItems.ToArray()
94
user1499731