2013-03-06 143 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());