2013-03-06 140 views
19

我通常使用foreach循環遍歷Dictionary。使用for循環遍歷字典

​​

在這種情況下,我想修剪空白的條目,然而foreach循環不允許這樣做。

foreach (var kvp in dictSummary) 
{ 
    kvp.Value = kvp.Value.Trim();  
} 

我該如何用for循環做到這一點?

for (int i = dictSummary.Count - 1; i >= 0; i--) 
{ 
} 
+0

可能重複:什麼是遍歷一個字典在C#中的最佳方式(http://stackoverflow.com/questions/141088/what - 這是最好的方式來迭代在字典中的c) – publicgk 2013-03-06 07:19:56

+3

或這;)http://stackoverflow.com/questions/1070766/editing-dictionary-values-in-a- foreach-loop – Belial09 2013-03-06 07:20:18

+1

@ Belial09在您發佈的鏈接中提出的問題中,似乎沒有修改鍵;只是價值觀。 – joce 2013-04-11 21:04:34

回答

14

KeyValuePair<TKey, TValue>不允許設置Value,這是不可改變的。

你將不得不做這樣的:

foreach(var kvp in dictSummary.ToArray()) 
    dictSummary[kvp.Key] = kvp.Value.Trim(); 

這裏最重要的部分是ToArray。這將複製字典到一個數組,所以更改foreach內的字典不會拋出InvalidOperationException

另一種方法是使用LINQ的ToDictionary方法:

dictSummary = dictSummary.ToDictionary(x => x.Key, x => x.Value.Trim()); 
32

這個是什麼?

for (int i = dictSummary.Count - 1; i >= 0; i--) { 
    var item = dictSummary.ElementAt(i); 
    var itemKey = item.Key; 
    var itemValue = item.Value; 
} 
+5

雖然有可能使用這樣的代碼,我不會推薦它。 'Enumerable.ElementAt'並不是訪問字典中元素的最佳方法...您的代碼可能是O(n^2),因爲Dictionary不允許按位置訪問元素。 – 2013-03-06 07:34:21

+1

你爲什麼從頭到尾迭代?不要告訴我,這是因爲性能的原因... – DHN 2013-03-06 07:50:34

+0

@AlexeiLevenkov ...謝謝。我不知道這件事。剛剛搜索了這個問題,它看起來像一個巨大的缺點。再次感謝。 – 2013-03-06 07:52:53

3

你並不需要使用.ToArray().ElementAt()。這是因爲訪問字典的鍵一樣簡單:

dictSummary.Keys.ToList().ForEach(k => dictSummary[k] = dictSummary[k].Trim());