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

PowerShell
PR