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となり、 何も表示されません