C# 在循环过程中无法修改集合时正在修改集合#

C# 在循环过程中无法修改集合时正在修改集合#,c#,collections,invalidoperationexception,concurrentmodification,C#,Collections,Invalidoperationexception,Concurrentmodification,下面代码的foreach语句抛出InvalidOperationException,表示“集合已被修改。枚举操作无法执行”。我不明白这是怎么可能的,因为颜色在初始化后永远无法修改 Dictionary<Color, int> colorDictionary = new Dictionary<Color, int>(); //Put stuff in colorDictionary... int currentBest = 257; Color replaceColor =

下面代码的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]--;
    }
}
字典颜色字典=新字典();
//把东西放到颜色字典里。。。
int currentBest=257;
Color replaceColor=Color.Empty;
Dictionary.KeyCollection colors=colorDictionary.Keys;
foreach(颜色中的c色)
{
如果(颜色字典[c]==0)
{
继续;
}
if(色差(颜色,c)
我不明白这是怎么可能的,因为颜色在初始化后永远无法修改

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]--;
    }
}
这是一个关于字典键的视图。。。您正在修改字典:

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

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

IEnumerable<Color> colors = colorDictionary.Keys.ToList();
IEnumerable colors=colorDictionary.Keys.ToList();
我不明白这是怎么可能的,因为颜色在初始化后永远无法修改

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]--;
    }
}
这是一个关于字典键的视图。。。您正在修改字典:

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

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

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

据我所知,KeyCollection没有ToList(),因此我将使用CopyTo并将颜色设置为颜色[]。@user1825860:没有,但它实现了
IEnumerable
,因此您可以使用LINQ扩展方法
Enumerable.ToList()
。只要确保你有一个
使用
指令的
系统.Linq
。哦。。。哎呀。你回复时,我用解决方案编辑了我的评论。不过我会使用你的,它更好。据我所知,KeyCollection没有ToList(),所以我会使用CopyTo并使颜色成为颜色[]。@user1825860:没有,但它实现了
IEnumerable
,所以你可以使用LINQ扩展方法
Enumerable.ToList()
。只要确保你有一个
使用
指令的
系统.Linq
。哦。。。哎呀。你回复时,我用解决方案编辑了我的评论。不过我会用你的,这样更好。