在C#中循环遍历字典

3

我知道在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;
}

因为我不是在编辑密钥本身,所以选择这种解决方案是否有任何不良影响或者是不好的呢?(如果我编辑这些密钥,可能会引起很多问题。)

谢谢。

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


2
第一段代码不起作用吗? - Samuel Carrijo
你说得对。抱歉 - 我已经修复了它以展示我试图描述的问题。 - JasCav
4个回答

9

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

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

7
在你的例子中,我觉得你并没有编辑字典的值(或键)?
总体而言,你的解决方案看起来不错,你可以用更少的代码实现,像这样:
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(我猜这就是原因)。但是,感谢您提出的建议。 - JasCav
1
ToList() 完全没有必要,"in aDictionary.Keys" 就可以正常工作。 - Thorarin
@Thorarin:如果您省略ToList,那么在枚举字典时修改它不会引发异常吗?(这就是最初的问题) - waterlooalex

1

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


0

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

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

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接