PowerShell: orderedによる順序付けされた連想配列
通常、連想配列はキーの格納順序は不定なので、 どの順番にどのキーがあるのかはわかりません。 ですがPowerShell3.0以降では連想配列を作成する時に、 [ordered]属性を付けることで、 キーの格納順序が保証された 特殊な連想配列を作成できます。
この順序付けされた連想配列を使うと、 キーによるアクセスだけでなく、 インデックスによるアクセスも可能になります。
orderedによる連想配列を作成する
連想配列リテラルの @ アットマークの前に角括弧を使って[ordered] と記述するだけです(PowerShell3.0以降で使用可能)。
$h = [ordered]@{ a = 100 b = 200 c = 300 } $h $h.GetType().Name # 実行結果 Name Value ---- ----- a 100 b 200 c 300 OrderedDictionary
格納した順番に表示されていて、 GetType()の結果が「OrderedDictionary」 となっています。 通常の連想配列は「Hashtable」と表示されますが、 Orderedは順序が保たれている、 Dictionaryは辞書(ハッシュテーブル)の意味です。
インデックスによるアクセス
インデックスでアクセスする場合、 配列と同じように[インデックス]を使います。
$h = [ordered]@{ a = 100 b = 200 c = 300 } $h.a # 100 $h[0] # 100 $h.b # 200 $h[1] # 200 $h.c # 300 $h[2] # 300
要素の追加
要素を追加した場合も順番に追加されます。
次のコードでは後からAddメソッドで要素を2つ追加して、
順番に追加されていることを確認しています。
$h = [ordered]@{ a = 100 b = 200 c = 300 } $h.Add("d", 400) $h.Add("e", 500) $h[0] # 100 $h[3] # 400 $h[4] # 500 $h # 実行結果 Name Value ---- ----- a 100 b 200 c 300 d 400 e 500
要素の削除
要素を削除した場合も、 配列と同じようにインデックスが1つ減ります。
次のコードでは連想配列の3つの要素の中で、 真ん中の要素"b"をRemoveメソッドで削除しています。 その後でインデックスを使ってアクセスしています。
$h = [ordered]@{ a = 100 b = 200 c = 300 } $h.Remove("b") $h.Count # 2 $h[0] # 100 $h[1] # 300 $h[2] # Null
最後の$h[2]は要素が存在しないためNullとなり、 何も表示されません