Как обновить значения при переборе элементов словаря? - PullRequest
6 голосов
/ 23 августа 2011

У меня есть словарь:

Dictionary<string, long> Reps = new Dictionary<string, long>();

, и я хочу обновить значения во время итерации по всем элементам, например:

foreach (string key in Reps.keys)
{
    Reps[key] = 0;
}

, это выдает мне сообщение об ошибке:

"Collection was modified; enumeration operation may not execute"

Может кто-нибудь сказать мне, почему он дает мне эту ошибку, потому что у меня есть еще одна функция, которая добавляет значение, и она вызывается при нажатии кнопки:

public static void Increment(string RepId, int amount)
{
     long _value = Convert.ToInt64(Reps[RepId]);
     _value = _value + amount;
     Reps[RepId] = _value;
}

и эта функция работает нормально.так в чем проблема при обновлении всех значений?И какое решение для этого?

Ответы [ 3 ]

4 голосов
/ 24 августа 2011

более упрощенно, сделайте это:

foreach (string key in Reps.keys.ToList())
{
    Reps[key] = 0;
}

и причина ошибки в том, что вы пытаетесь редактировать фактический объект, который используется, и если вы делаете его копию, а затем используете его следующим образом:

var repscopy = Reps;
foreach (string key in repscopy.keys)
    {
        Reps[key] = 0;
    }

выдаст ту же ошибку, что и указатель на исходный объект, а при добавлении ToList () создаст новый объект List

4 голосов
/ 23 августа 2011

Проблема заключается не в обновлении значений, вы просто не можете изменить коллекцию, на которой основан ваш foreach (), во время итерации foreach.

Попробуйте что-нибудь подобное

List<string> keylist = Reps.keys.ToList();
foreach(string r in keylist) 
{
Reps[r] = 0;
}

это будет работать.

3 голосов
/ 23 августа 2011

Это происходит потому, что вы изменяете элемент в Dictionary<string, long>, зацикливая его на foreach.Попробуйте это.

foreach (string key in Reps.Keys.ToList())
{
    Reps[key] = 0;
}

Теперь вы перебираете список, созданный из ключа dictionarys.Поскольку это не оригинальная коллекция, которая была изменена, ошибка исчезнет.

...