2010-06-29 181 views
5

我有這個和所有似乎工作正常,但不知道爲什麼,如果它的有效。C# - 從while循環中的詞典中刪除項目

 Dictionary<string, List<string>> test = new Dictionary<string, List<string>>(); 

     while (test.Count > 0) 
     { 
      var obj = test.Last(); 
      MyMethod(obj); 
      test.Remove(obj.Key); 
     } 

更新:謝謝你的答案,我已經更新了我的代碼來解釋爲什麼我不這樣做Dictionary.Clear();

回答

10

以這種方式在while循環中改變集合類型沒有任何問題。當您在foreach區塊中變更收集時,您遇到麻煩的地方是。或者在基礎集合發生變異後更一般地使用IEnumerator<T>

雖然在此示例中這將是一個簡單得多,只是叫test.Clear() :)

1

這樣的作品,很好的,因爲你不遍歷字典同時刪除項目。每次檢查test.Count時,就像是從頭開始檢查它。

話雖這麼說,上面的代碼可以寫成更簡單,更有效:

test.Clear(); 
1

它的工作原理,因爲伯爵將在每次你刪除一個對象時更新。所以說計數是3,test.Remove會將count計爲2,依此類推,直到計數爲0,那麼你將跳出循環

0

您正在做的是取出集合中的最後一個項目並將其刪除,直到「詞典」中沒有剩餘項目。

沒有什麼不尋常的,沒有理由不應該工作(只要清空集合是你想要做的)。

0

所以,你只是想清除字典,對嗎?你不能只做以下嗎?

Dictionary<string, List<string>> test = new Dictionary<string, List<string>>(); 
     test.Clear(); 
0

這似乎可以工作,但它看起來非常昂貴。如果你用foreach循環遍歷它,這會是一個問題(你不能在迭代時編輯集合)。

Dictionary.Clear()應該做的伎倆(但你可能已經知道了)。

0

儘管你的更新,你可能仍然使用清晰......

foreach(var item in test) { 
    MyMethod(item); 
} 
test.Clear() 

你來。去年(呼叫)將是一個大辭典效率極其低下,並不能保證任何特定順序(字典是一個無序的集合)

8

我不明白你爲什麼試圖按相反的順序處理所有Dictonary條目 - 但你的代碼是確定的。

這可能是一個快一點讓所有鍵的列表和處理,而不是一次又一次地通過計數關鍵項...

E.G.:

var keys = test.Keys.OrderByDescending(o => o).ToList(); 

foreach (var key in keys) 
{ 
    var obj = test[key]; 
    MyMethod(obj); 
    test.Remove(key); 
} 

Dictonarys通過鍵值訪問時速度很快。 Last()速度較慢並且不需要計數 - 您可以獲取所有(唯一)鍵的列表。