下記のコードで、Dictionaryの全ての値を更新する処理を書きました。
すると、
「コレクションが変更されました。列挙操作は実行されない可能性があります。」
というエラーが発生しました。
このような処理は行ってはいけないのでしょうか。
コレクションをまわしながら、更新してはいけない?
Dictionary<string, string> map = new Dictionary<string, string>();
map.Add(1, aa);
map.Add(2, bb);
map.Add(3, cc);
Dictionary<string,string>.KeyCollection key = map.Keys;
foreach (string str in key)
{
map[str] = aa;
}
foreach中でコレクションを変更してはいけません。
というか,コレクションを変更した場合,IEnumerator.MoveNextが
InvalidOperationExceptionを送出します。
http://msdn2.microsoft.com/ja-jp/library/ttw7t8t6.aspx
> foreach ステートメントは、コレクションを繰り返し処理して目的の情報を取得するの
に使用しますが、予期しない動作を防ぐため、コレクション内容の変更には使用しないで
ください。
http://msdn2.microsoft.com/ja-jp/library/
system.collections.ienumerator.movenext.aspx
> 要素の追加、変更、削除などの変更がコレクションに対して実行されると、列挙子は回
復不可能な無効状態になり、次に MoveNext または Reset を呼び出すと
InvalidOperationException がスローされます。
foreach中は、コレクションを変更してはいけなかったんですね。知らなかった。
参照先、ご紹介ありがとうございます。
IList<string> list = new List<string>(map.Keys);
foreach (string str in list)
{
map[str] = aa;
}
Keysから新しいリストを作成してぐるぐるまわすことにしました。