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

时间:2011-08-23 11:27:35

标签: asp.net dictionary enumeration

我有一本字典:

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 个答案:

答案 0 :(得分:4)

问题是没有更新值,你只是无法在重复foreach时更改foreach()所基于的集合。

尝试这样的事情

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

这会奏效。

答案 1 :(得分:4)

更简化,执行此操作:

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

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

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

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

答案 2 :(得分:3)

这是因为您正在使用Dictionary<string, long>更改foreach中的元素,同时使用foreach (string key in Reps.Keys.ToList()) { Reps[key] = 0; } 进行循环。试试这个。

{{1}}

现在循环遍历从dictionarys键创建的列表。由于它不是修改过的原始集合,因此错误将消失。