【问题标题】:using a for loop to iterate through a dictionary使用 for 循环遍历字典
【发布时间】: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--)
{
}

【问题讨论】:

标签: c# for-loop dictionary


【解决方案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&lt;TKey, TValue&gt; 不允许你设置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());
    

    【讨论】:

      猜你喜欢
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2014-06-07
      相关资源
      最近更新 更多