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
無事、エラーが出なくなりました。