将数据从一个词典加载到另一个词典

时间:2017-01-24 10:32:07

标签: c# dictionary

我想更新数据。从输入数据转换为相同结构从一个字典到另一个字典,我已经存在的数据。

伪代码:

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];
    }
}   

但当然这会产生以下错误:

  

“集合已被修改;枚举操作可能无法执行。”

处理此操作的最佳方法是什么?

3 个答案:

答案 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];
    }
}