2011-08-23 72 views
6

我有一本字典:如何在迭代字典項目時更新值?

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

,我要更新的值,而通過全項迭代,就像這樣:

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

它給我一個錯誤說:

"Collection was modified; enumeration operation may not execute" 

任何人都可以告訴我爲什麼它給了我這個錯誤,因爲我有一個更多的功能,增加了價值,它被點擊按鈕時調用:

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

這個函數工作正常。那麼更新所有值時會出現什麼問題?而這是什麼解決方案?

回答

4

更簡化,這樣做:

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

和錯誤的原因是您試圖編輯實際的對象,它是在使用中,如果你做它的一個副本,然後使用它像這樣:

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; 
} 

這會工作。

+1

它的工作呢,但是你只有一個人回答我的部分questi即解決方案...你能解釋一下錯誤的原因嗎? –

+1

嗯,我猜是因爲foreach是基於集合的,如果你想改變集合,那麼foreach是如何確定哪些部分需要處理的?哪些不是?例如。如果你在迭代期間添加一個新的Reps [x],你會期望它參與到foreach中嗎? – Pleun

3

發生這種情況是因爲您正在更改Dictionary<string, long>中的元素,同時使用foreach進行循環。嘗試這個。

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

現在您循環使用dictionarys鍵創建的列表。因爲它不是修改後的原始集合,錯誤將會消失。