我想更新数据。从输入数据转换为相同结构从一个字典到另一个字典,我已经存在的数据。
伪代码:
Dictionary<foo, bar> originalData; // Count = 128
Dictionary<foo, bar> inputData; // Count = 112
我可以写下面的代码:
foreach (var key in originalData.Keys)
{
if (inputData.ContainsKey(key))
{
originalData[key] = inputData[key];
}
}
但当然这会产生以下错误:
“集合已被修改;枚举操作可能无法执行。”
处理此操作的最佳方法是什么?
答案 0 :(得分:3)
为什么不转动迭代器?这是安全的,因为您测试了两个词典中存在的键。
foreach (var key in inputData.Keys)
{
if (originalData.ContainsKey(key))
{
originalData[key] = inputData[key];
}
}
答案 1 :(得分:3)
您可以从另一端开始:而不是迭代originalData
,迭代inputData
:
foreach (var pair in inputData) {
if (originalData.ContainsKey(pair.Key)) {
originalData[pair.Key] = pair.Value;
}
}
请注意,通过迭代键值对,您可以避免第二次查找inputData
。
您可以更进一步,将if
转换为LINQ:
foreach (var pair in inputData.Where(p => originalData.ContainsKey(p.Key))) {
originalData[pair.Key] = pair.Value;
}
答案 2 :(得分:1)
您的问题是您正在修改正在迭代的集合。您可以使用LINQ ToArray
迭代密钥副本并避免出现问题:
foreach (var key in originalData.Keys.ToArray())
{
if (inputData.ContainsKey(key))
{
originalData[key] = inputData[key];
}
}