Следующий оператор 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]--;
}
}
Я не вижу, как это возможно, поскольку цвета после его инициализации никогда не могут быть изменены.
Это взгляд на словарные ключи... и вы меняете словарь здесь:
colorDictionary[c]--;
По общему признанию, это фактически не добавление или удаление каких-либо ключей - но это изменение словаря, и перечислитель ключей в основном чувствителен к этому.
Простейшим решением было бы просто создать копию:
IEnumerable<Color> colors = colorDictionary.Keys.ToList();
IEnumerable<TKey>
, поэтому вы можете использовать метод расширения LINQEnumerable.ToList()
. Просто убедитесь, что у вас есть директиваusing
дляSystem.Linq
.