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

1

Следующий оператор 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]--;
    }
}
Теги:
collections
invalidoperationexception
concurrentmodification

1 ответ

5

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

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

colorDictionary[c]--;

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

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

IEnumerable<Color> colors = colorDictionary.Keys.ToList();
  • 0
    Насколько я знаю, KeyCollection не имеет ToList (), поэтому я буду использовать CopyTo и сделаю цвета Color [].
  • 0
    @ user1825860: Нет, но он реализует IEnumerable<TKey> , поэтому вы можете использовать метод расширения LINQ Enumerable.ToList() . Просто убедитесь, что у вас есть директива using для System.Linq .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню