
PowerShell 連想配列に順序を付けたい
PowerShellに限らず、他の言語系でも連想配列はキーの格納順序は不定なので、 どの順番にどのキーがあるのかは分かりません。感覚的には追加順に並んでいそうですがそのようになっていません。格納順序が不定なのでバグになる場合がある。
PowerShellでの解決方法
PowerShellでは連想配列に [ordered]属性を付けることでキーの順序付けができます。順序付けを使うと インデックスによるアクセスも可能になります。
orderedによる連想配列を作成する
連想配列の@アットマークの前に角括弧を使って[ordered]と記述するだけです。
$my_dict = [ordered]@{
a = "リンゴ"
b = "ゴリラ"
c = "ラッセル・クロウ"
}
$my_dict
$my_dict.GetType().Name
## 実行結果
#Name Value
#---- -----
#a リンゴ
#b ゴリラ
#c ラッセル・クロウ
#OrderedDictionary
$my_dict2 = @{
a = "リンゴ"
b = "ゴリラ"
c = "ラッセル・クロウ"
}
$my_dict2
$my_dict2.GetType().Name
## 実行結果
#Name Value
#---- -----
#c ラッセル・クロウ
#b ゴリラ
#a リンゴ
#Hashtable
[ordered] を付けた方は格納した順序が保たれていて、 通常の連想配列は順序が違っています。
通常の連想配列に要素を追加するともっとバラバラになり、順序の保証がないことがわかります。
$my_dict2 = @{
a = "リンゴ"
b = "ゴリラ"
c = "ラッセル・クロウ"
}
$my_dict2.add("d","ウチムラ・カズ")
$my_dict2
## 実行結果
#Name Value
#---- -----
#c ラッセル・クロウ
#d ウチムラ・カズ
#b ゴリラ
#a リンゴ
インデックスによるアクセス
インデックスでアクセスする場合、 配列と同じように[インデックス]を使います。
$my_dict = [ordered]@{
a = "リンゴ"
b = "ゴリラ"
c = "ラッセル・クロウ"
}
$my_dict.a # リンゴ
$my_dict[0] # リンゴ
$my_dict.b # ゴリラ
$my_dict[1] # ゴリラ
$my_dict.c # ラッセル・クロウ
$my_dict[2] # ラッセル・クロウ
要素の追加
要素を追加した場合も順番が保たれます。
Addメソッドで要素を2つ追加して、 順番に追加されていることを確認しています。
$my_dict = [ordered]@{
a = "リンゴ"
b = "ゴリラ"
c = "ラッセル・クロウ"
}
$my_dict.Add("e", "ウチムラ・カズ")
$my_dict[0] # リンゴ
$my_dict[3] # ラッセル・クロウ
$my_dict[4] # ウチムラ・カズ
$my_dict
# 実行結果
#Name Value
#---- -----
#a リンゴ
#b ゴリラ
#c ラッセル・クロウ
#d ウチムラ・カズ
要素の削除
次のコードでは連想配列の 真ん中の要素"b"を削除しています。
その後でインデックスを使ってアクセスしています。
$my_dict = [ordered]@{
a = "リンゴ"
b = "ゴリラ"
c = "ラッセル・クロウ"
}
$my_dict.Remove("b") # ゴリラを削除
$my_dict.Count # 2
$my_dict[0] # リンゴ
$my_dict[1] # ラッセル・クロウ
$my_dict[2] # $my_dict[2]は要素が存在しないため何も表示されません
#PowerShell #連想配列 #コマンドレット #プログラミング学習 #プログラミング初心者 #ordered #順序付き連想配列