【问题标题】:Looping Over Dictionary in C#在 C# 中循环遍历字典
【发布时间】:2023-04-03 00:50:01
【问题描述】:

我意识到您不能在 C# 中迭代​​字典并编辑底层字典,如下例所示:

Dictionary<Resource, double> totalCost = new Dictionary<Resource, double>();
// Populate the Dictionary in here - (not showing code).    
foreach (Resource resource in totalCost.Keys)
{
     totalCost[resource] = 5;
}

我认为解决此问题的一种方法是创建一个由字典的键支持的列表,如下所示:

Dictionary<Resource, double> totalCost = new Dictionary<Resource, double>();
// Populate the Dictionary in here - (not showing code).    
foreach (Resource resource in new List(totalCost.Keys))
{
     totalCost[resource] = 5;
}

因为我没有自己编辑密钥,所以有什么理由不应该这样做,或者选择它作为解决方案是不好的。 (我意识到如果我正在编辑这些键,这可能会导致很多问题。)

谢谢。

编辑: 修复了我的代码示例。对此感到抱歉。

【问题讨论】:

  • 第一段代码不行吗?
  • 你是对的。对此感到抱歉 - 修复它以显示我试图描述的问题。

标签: c# collections dictionary


【解决方案1】:

您可以使用KeyValuePair 类循环字典。

Dictionary<string, string> d1 = new Dictionary<string, string>();
foreach (KeyValuePair<string, string> val in d1)
{ 
    ...
}

【讨论】:

    【解决方案2】:

    在您的示例中,我看起来不像您正在编辑字典值(或键)?

    一般来说,您的解决方案看起来不错,您可以使用更少的代码来完成,如下所示:

    List<double> total = new List<double>();
    foreach (AKeyObject key in aDictionary.Keys.ToList())
    {
       for (int i = 0; i < aDictionary[key].Count; i++)
       {
          total[i] += aDictionary[key][i];
       }
    }
    

    【讨论】:

    • 不幸的是,我无法访问“ToList()”——仍在使用 Visual Studio 2005(我猜这就是原因)。但是,谢谢你的建议。
    • ToList() 无论如何都是完全没有必要的,“in aDictionary.Keys”可以正常工作。
    • @Thorarin:如果省略 ToList,在枚举字典时是否会出现修改字典的异常? (因此最初的问题)
    【解决方案3】:

    您的第一段代码在我看来很好 - 您根本没有在编辑字典。

    【讨论】:

      【解决方案4】:

      这是另一个更类似于 LINQ 的版本:

      totalCost = totalCost
           .ToDictionary( kvp => kvp.Key, 5 );
      

      或者,如果 5 不是你想要的 :)

      totalCost = totalCost
           .ToDictionary( kvp => kvp.Key, CalculateSomething(kvp.Value) );
      

      (注意:这不会编辑底层字典,而是用新字典替换它)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-11
        • 2023-03-12
        • 2022-09-22
        • 2013-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多