枚举时如何更改Dictionary的值?

时间:2010-04-23 06:02:33

标签: c#

枚举时如何更改Dictionary的值? 以下代码不起作用,因为枚举时我们无法更改字典的值。有没有办法绕过它?或者没有办法?感谢

foreach (KeyValuePair<string, int> kvp in mydictionary)
        {
            if (otherdictionary.ContainsKey(kvp.Key))
            {
                mydictionary[kvp.Key] = otherdictionary[kvp.Key];

            }
            else
            {
                otherdictionary[kvp.Key] = mydictionary[kvp.Key];
            }
        }

3 个答案:

答案 0 :(得分:6)

最简单的方法是先复制一份。由于您只需要键值对,您可以将它们放在列表中,而不是构建新的字典。此外,您可以避免使用TryGetValue进行尽可能多的查找。

var copy = myDictionary.ToList();
foreach (KeyValuePair<string, int> kvp in copy)
{
    int otherValue;
    if (otherdictionary.TryGetValue(kvp.Key, out otherValue))
    {
        mydictionary[kvp.Key] = otherValue;
    }
    else
    {
        otherdictionary[kvp.Key] = kvp.Value;
    }
}

答案 1 :(得分:5)

在枚举之前复制您需要枚举的值,然后您可以更改原始来源。

由于您实际上并未使用该值,因此可以将代码更改为:

foreach (string key in mydictionary.Keys.ToArray())
    if (otherdictionary.ContainsKey(key))
        mydictionary[key] = otherdictionary[key];
    else
        otherdictionary[key] = mydictionary[key];

注意在那里使用.ToArray()来创建密钥集合的临时数组副本。现在它与源字典分开,因此您可以随意更改字典。

答案 2 :(得分:0)

另一个选项,将密钥集合复制到一个数组,并将其用于每个循环 -

string [] arr1 = new string [mydictionary.Count];

mydictionary.Keys.CopyTo(arr1,0);

    foreach (string j in arr1)
    {
        if (otherdictionary.ContainsKey(j))
        {
            mydictionary[j] = otherdictionary[j];

        }
        else
        {
            otherdictionary[j] = mydictionary[j];
        } 
    }