2013-05-04 350 views
0

我有這樣的代碼,它是給我集合被修改,並且可以不再一一列舉,但我並沒有改變值:收藏已修改;枚舉操作可能不會執行

public static void AddtoDictionary(string words, Dictionary<int, int> dWords) 
{ 
    if (DCache.ContainsKey(words)) 
    { 
     Dictionary<int, int> _dwordCache = DCache[words]; 

     //error right here 
     foreach (int _key in _dwordCache.Keys) 
     { 
      int _value = _dwordCache[_key]; 

      if (dWords.ContainsKey(_key)) 
      { 
       dWords[_key] = (dWords[_key] + _value); 
      } 
      else 
      { 
       dWords[_key] = _value; 
      } 
     } 
    } 
} 

我改變了dWords和不改變_dwordCache 。有兩本字典。我可以理解,如果我改變_dwordCache它會給我那個錯誤,但參數正在改變。

+1

你確定'DCache [words]'沒有返回'dWords'引用的*相同*字典嗎?換句話說,即使你有兩個變量,也許你只有一個字典。 – 2013-05-04 16:41:34

+0

在'foreach'循環之前,執行此代碼並告訴我結果:'var same = Object.ReferenceEquals(_dwordCache,dWords);' – 2013-05-04 16:41:58

+0

此行if(DCache.ContainsKey(words))是一個清除信號。我想你是從緩存中獲得相同的字典 – Steve 2013-05-04 16:43:38

回答

0

你確定DCache [words]元素在foreach運行時沒有被修改過嗎?

1

一個快速和骯髒的方式炸掉這座這個錯誤被轉換爲不同的列表:

foreach (int _key in _dwordCache.Keys.ToList()) 

確保您已「使用System.Linq的;」在文件的頂部。

但是,如果您有大量列表,上面的建議可能會導致您的程序中斷,一旦您調用代碼,就會一次又一次地創建另一個列表。

那麼在這種情況下你可能會遠離統計員。嘗試替換你的「foreach」:

for (int i = 0; i < _dwordCache.Keys.Count; i++) 
{ 
    var key = _dwordCache.ElementAt(i); 
} 
+0

for語句是你在90%的其他情況下處理它的方式,但它不適用於Dictionary,它不會實現'this [int i]'(它的確如此,但並不像你想要的那樣要使用它,它確實是'This [Tkey i]',在這個問題中''我恰好是一個'int') – 2013-05-04 20:49:09

+0

.ToList()建議起作用。 但是,第二個建議是缺少的東西: for(int i = 0; i <_dwordCache.Keys.Count; i ++) var key = _dwordCache.ElementAt(i); – Cesar 2013-05-05 14:58:08

相關問題