枚举时如何更改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];
}
}
答案 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];
}
}