在循环期间修改集合时,它无法成为C#

时间:2014-08-27 21:49:31

标签: c# collections invalidoperationexception concurrentmodification

以下代码的foreach语句抛出InvalidOperationException,说“集合已被修改。枚举操作无法执行”。我看不出这是怎么可能的,因为颜色在初始化后永远不会被修改。

Dictionary<Color, int> colorDictionary = new Dictionary<Color, int>();
//Put stuff in colorDictionary...
int currentBest = 257;
Color replaceColor = Color.Empty;
Dictionary<Color, int>.KeyCollection colors = colorDictionary.Keys;
foreach (Color c in colors)
{
    if (colorDictionary[c] == 0)
    {
        continue;
    }
    if (ColorDistance(color, c) < currentBest)
    {
        replaceColor = c;
        colorDictionary[c]--;
    }
}

1 个答案:

答案 0 :(得分:5)

  

我看不出这是怎么可能的,因为颜色在初始化后永远不会被修改。

这是关于字典键的一个视图......你在这里修改字典:

colorDictionary[c]--;

不可否认,实际上并没有添加或删除任何密钥 - 但是它正在修改字典,而密钥枚举器对此基本上很敏感。

最简单的解决方法就是创建副本:

IEnumerable<Color> colors = colorDictionary.Keys.ToList();