我通常使用foreach循环遍历Dictionary。使用for循环遍历字典
在这种情况下,我想修剪空白的条目,然而foreach循环不允许这样做。
foreach (var kvp in dictSummary)
{
kvp.Value = kvp.Value.Trim();
}
我该如何用for循环做到这一点?
for (int i = dictSummary.Count - 1; i >= 0; i--)
{
}
我通常使用foreach循环遍历Dictionary。使用for循环遍历字典
在这种情况下,我想修剪空白的条目,然而foreach循环不允许这样做。
foreach (var kvp in dictSummary)
{
kvp.Value = kvp.Value.Trim();
}
我该如何用for循环做到这一点?
for (int i = dictSummary.Count - 1; i >= 0; i--)
{
}
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 (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),因为Dictionary不允许按位置访问元素。 – 2013-03-06 07:34:21
你为什么从头到尾迭代?不要告诉我,这是因为性能的原因... – DHN 2013-03-06 07:50:34
@AlexeiLevenkov ...谢谢。我不知道这件事。刚刚搜索了这个问题,它看起来像一个巨大的缺点。再次感谢。 – 2013-03-06 07:52:53
你并不需要使用.ToArray()
或.ElementAt()
。这是因为访问字典的键一样简单:
dictSummary.Keys.ToList().ForEach(k => dictSummary[k] = dictSummary[k].Trim());
可能重复:什么是遍历一个字典在C#中的最佳方式(http://stackoverflow.com/questions/141088/what - 这是最好的方式来迭代在字典中的c) – publicgk 2013-03-06 07:19:56
或这;)http://stackoverflow.com/questions/1070766/editing-dictionary-values-in-a- foreach-loop – Belial09 2013-03-06 07:20:18
@ Belial09在您发布的链接中提出的问题中,似乎没有修改键;只是价值观。 – joce 2013-04-11 21:04:34