当集合不可能是C#时,它在循环期间被修改

本文关键字:循环 修改 不可能 集合 | 更新日期: 2023-09-27 18:19:56

以下代码的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]--;
    }
}

当集合不可能是C#时,它在循环期间被修改

我不明白这怎么可能,因为颜色在初始化后永远无法修改。

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

colorDictionary[c]--;

诚然,这实际上并不是在添加或删除任何键,而是在修改字典,而键枚举器基本上对此很敏感。

最简单的修复方法就是创建一个副本:

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