使用 for 循环遍历字典
Posted
技术标签:
【中文标题】使用 for 循环遍历字典【英文标题】:using a for loop to iterate through a dictionary 【发布时间】:2013-02-20 21:13:39 【问题描述】:我通常使用 foreach 循环来遍历 Dictionary。
Dictionary<string, string> dictSummary = new Dictionary<string, string>();
在这种情况下,我想修剪空白条目,但是 foreach 循环不允许这样做。
foreach (var kvp in dictSummary)
kvp.Value = kvp.Value.Trim();
如何使用 for 循环做到这一点?
for (int i = dictSummary.Count - 1; i >= 0; i--)
【问题讨论】:
可能重复:What is the best way to iterate over a Dictionary in C#? 或这个 ;) ***.com/questions/1070766/… @Belial09 在您发布的链接中提出的问题中,似乎没有修改密钥;只是价值观。 【参考方案1】:您不需要使用.ToArray()
或.ElementAt()
。就像用key访问字典一样简单:
dictSummary.Keys.ToList().ForEach(k => dictSummary[k] = dictSummary[k].Trim());
【讨论】:
【参考方案2】:这个呢?
for (int i = dictSummary.Count - 1; i >= 0; i--)
var item = dictSummary.ElementAt(i);
var itemKey = item.Key;
var itemValue = item.Value;
【讨论】:
虽然可以使用这样的代码,但我不推荐它。Enumerable.ElementAt
并不是访问字典中元素的最佳方式...您的代码可能是 O(n^2),因为字典不允许按位置访问元素。
你为什么要从头到尾迭代?别告诉我,是因为性能原因……
@AlexeiLevenkov ...谢谢。我不知道这件事。刚刚搜索了这个问题,它看起来像是一个巨大的缺点。再次感谢。
@DHN...好吧,我刚刚从问题中复制了它
这不是反向迭代的好用例。但是正确的用例是如果您打算删除项目。这样删除不会影响您的迭代/计数。【参考方案3】:
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());
【讨论】:
以上是关于使用 for 循环遍历字典的主要内容,如果未能解决你的问题,请参考以下文章