2011-08-23 5 views
6

私は辞書があります。ディクショナリ項目の反復処理中に値を更新する方法はありますか?

Dictionary<string, long> Reps = new Dictionary<string, long>(); 

をし、このように、すべてのアイテムを反復しながら、私は値を更新する:

"Collection was modified; enumeration operation may not execute" 

foreach (string key in Reps.keys) 
{ 
    Reps[key] = 0; 
} 

が、それは私に言って、エラーを与えています

値を追加する関数がもう1つあり、ボタンをクリックしたときに呼び出される理由は誰にでもわたしにこのエラーが表示される理由を教えてください。

public static void Increment(string RepId, int amount) 
{ 
    long _value = Convert.ToInt64(Reps[RepId]); 
    _value = _value + amount; 
    Reps[RepId] = _value; 
} 

この機能は正常に動作しています。すべての値を更新するときの問題は何ですか?そして、これのための解決策は何ですか?

答えて

4

より簡略化、これを行います:

var repscopy = Reps; 
foreach (string key in repscopy.keys) 
    { 
     Reps[key] = 0; 
    } 

、それはまた、元のオブジェクトを指していると、それは同じエラーを与えるだろう、とToListメソッド()が追加されたときには、リスト

4

問題は値の更新ではなく、foreachが反復されている間はforeach()が基にしているコレクションを変更できません。

が、これがうまくいくこの

List<string> keylist = Reps.keys.ToList(); 
foreach(string r in keylist) 
{ 
Reps[r] = 0; 
} 

ようsomehtingを試してみてください。

+1

そのwokringの新しいオブジェクトを作成したが、一つだけに答えています私のクエストの一部解決策に...あなたはエラーの理由は何かについてもっと説明できますか? –

+1

foreachはコレクションに基づいていると思います。コレクションを変更すると、foreachはどのような部分を処理するのか、どうしたらいいのかを判断できますか?例えば。反復中に新しいReps [x]を追加すると、foreachに参加するかどうかが分かりますか? – Pleun

3

これは、foreachでループしている間に、Dictionary<string, long>の要素を変更しているために発生します。これを試して。

foreach (string key in Reps.Keys.ToList()) 
{ 
    Reps[key] = 0; 
} 

ここでは、辞書キーから作成したリストをループしています。オリジナルのコレクションは変更されていないので、エラーは消えてしまいます。

foreach (string key in Reps.keys.ToList()) 
{ 
    Reps[key] = 0; 
} 

をし、エラーの理由は、あなたが使用されている実際のオブジェクトを編集しようとしている、あなたはそれのコピーを作成している場合は、このように使用されている。

関連する問題