はじめに
ハッシュテーブルとは、配列によく似た構造で「キー」を使用して各値を設定します。
$ht = @{"Key1"="Value1"}
今回は、このハッシュテーブルの値をfor文やforeach文で回して更新する方法の備忘録となります。
OrderedDictionaryとしてハッシュテーブルを作成している場合
ハッシュテーブルでは「ordered」属性をつけることができます。この「ordered」属性を付与すると、この格納順序が保証されたハッシュテーブルとなります。
このようにordered属性をつけたハッシュテーブルをOrderedDictionaryと言います。
このOrderedDictionaryで作成すると「index」でアクセスすることができます。その場合はfor文を利用してデータを回して更新することができるようになります。
$ht = [ordered]@{
"Key1"="Value1"
"Key2"="Value2"
"Key3"="Value3"
}
for($i = 0; $i -lt $ht.Keys.Count; $i++) {
$ht[$i] = [string]::Format("{0}_{1}", $ht[$i], $i)
}
上記を実行すると下記のような結果が得られます。
Name Value
---- -----
Key1 Value1_0
Key2 Value2_1
Key3 Value3_2
更新されていることがわかります。
このようにordered属性を付与することで、順番が保障されインデックスを利用してアクセスすることができるようになります。
foreachを使ってハッシュテーブルを更新する
ordered属性を使用していない場合にはforeach文を使って更新することができます。
ただし、foreachを利用する場合は、ハッシュテーブルをクローンするか、新しくハッシュテーブルを作成する必要があります。(新しく作る場合は更新というより新規ですね)
$ht = @{
"Key1"="Value1"
"Key2"="Value2"
"Key3"="Value3"
}
foreach ($key in $ht.Clone().Keys) {
$ht[$key] = "Value999"
}
結果は下記のとおりです。
Name Value
---- -----
Key3 Value999
Key1 Value999
Key2 Value999
もしordered属性を設定していた場合は、OrderedDictionaryにCloneメソッドが存在しないので、下記のようなエラーが発生します。
[System.Collections.Specialized.OrderedDictionary] に 'Clone' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。
また、クローンせずにそのままハッシュテーブルを使って更新しようとすると下記のようなエラーが発生します。
コレクションが変更されました。列挙操作は実行されない可能性があります。
Name Value
---- -----
Key3 Value999
Key1 Value1
Key2 Value2
上記の通り一箇所のみが更新されエラーが発生して終了します。
最後に
ハッシュテーブルをループさせて更新させたい場合は[ordered]属性がついている場合と付いていない場合で方法が異なります。
是非参考にしてみてください。