如何在迭代字典项时更新值?

Saf*_*Ali 6 asp.net dictionary enumeration

我有一本字典:

Dictionary<string, long> Reps = new Dictionary<string, long>();
Run Code Online (Sandbox Code Playgroud)

我想在迭代所有项目时更新值,如下所示:

foreach (string key in Reps.keys)
{
    Reps[key] = 0;
}
Run Code Online (Sandbox Code Playgroud)

它给我一个错误说:

"Collection was modified; enumeration operation may not execute"
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我为什么它给我这个错误,因为我还有一个函数添加了值,并在单击按钮时调用它:

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

这个功能工作正常.那么更新所有值时会出现什么问题?最新解决方案是什么?

小智 4

更简单的是,这样做:

foreach (string key in Reps.keys.ToList())
{
    Reps[key] = 0;
}
Run Code Online (Sandbox Code Playgroud)

错误的原因是您正在尝试编辑正在使用的实际对象,如果您复制它,然后像这样使用它:

var repscopy = Reps;
foreach (string key in repscopy.keys)
    {
        Reps[key] = 0;
    }
Run Code Online (Sandbox Code Playgroud)

它会给出相同的错误,因为它也指向原始对象,并且当添加 ToList() 时,它创建了一个新的 List 对象