読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

Dictionaryの値をforeachで変更する【C#】

C#

このエントリーをはてなブックマークに追加

Dictionaryのforeach

まず、Dictionaryでforeachを行うには以下のようにKeyValuePairを使います。

Dictionary<string, int> dic = new Dictionary<string, string> (){
  {"key1", 100}, {"key2", 200} ,{"key3", 300}
};

foreach(KeyValuePair<string, int> pair in dic){
  Debug.Log (pair.Key + " " + pair.Value);
}

key1 100
key2 200
key3 300



しかし、foreach内でDictionaryの値を変えるために、以下のようにしてしまうと、

foreach(KeyValuePair<string, int> pair in dictionary){
  dictionary [pair.Key] *= 2;
}


InvalidOperationException: out of sync

と、エラーが表示されてしまいます。


Keysを使ってforeach

foreachで回してる時に値の変更は出来ないようなので、回す対象をDictionaryではなく、

keyの配列にします。


なお、keyの配列はDictionary.Keysで取得できます。

List<string> keyList = new List<string>(dictionary.Keys);


これを使って先ほどのコードを書き換えると以下のようになります。

Dictionary<string, int> dictionary = new Dictionary<string, int> () {
  {"key1", 100}, {"key2", 200} ,{"key3", 300}
};

List<string> keyList = new List<string>(dictionary.Keys);

foreach(string key in keyList){
  dictionary [key] *= 2;
  Debug.Log (key + " " + dictionary [key]);
}

key1 200
key2 400
key3 600


無事、エラーが出なくなりました。