Коллекция, изменяемая во время цикла, когда нет возможности использовать C#

В приведенном ниже коде оператор 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 ответ

Я не понимаю, как это возможно, поскольку цвета не могут быть изменены после инициализации.

Это просмотр ключей словаря... и вы изменяете словарь здесь:

colorDictionary[c]--;

По общему признанию это не фактически добавляет или удаляет какие-либо ключи - но это изменяет словарь, и перечислитель ключей в основном чувствителен к этому.

Простейшим решением было бы просто создать копию:

IEnumerable<Color> colors = colorDictionary.Keys.ToList();
Другие вопросы по тегам