关于使用c#中的字典的asp.net:Error

Error using a dictionary in c#

我正试图通过查字典来看看它是否有某个值,如果有,那么就改变它。这是我的代码:

1
2
3
4
5
6
7
foreach (var d in dictionary)
{
    if (d.Value =="red")
    {
         d.Value ="blue";
    }
}

在Visual Studio中,当我单步调试代码时,我可以看到它更改了值,然后当它点击foreach循环再次重复时,它抛出了一个异常

"Collection was modified; enumeration operation may not execute"

我该怎么解决这个问题?


你不能在前臂中间改变它-你需要想出一些其他的机制,比如:

1
2
3
4
// Get the KeyValuePair items to change in a separate collection (list)
var pairsToChange = dictionary.Where(d => d.Value =="red").ToList();
foreach(var kvp in pairsToChange)
    dictionary[kvp.Key] ="blue";


1
2
3
4
5
6
7
8
9
10
11
12
13
14
var dict = new Dictionary<string, string>()
          {
                  {"first","green" },
                  {"second","red" },
                  {"third","blue" }
          };

foreach (var key in dict.Keys.ToArray())
{
    if (dict[key] =="red")
    {
        dict[key] ="blue";
    }
}


foreach循环中的对象是只读的。

请通读这篇和这篇,以获得更多的理解。


您不能在foreach循环中修改正在迭代的集合。如果你能做到这一点,它将打开几个问题,例如"我也要在这个新增加的值上运行它吗?"

相反,您应该这样做:

1
2
3
4
5
6
7
foreach( string key in dictionary.Keys )
{
    if( dictionary[key] =="red" )
    {
        dictionary[key] ="blue";
    }
}


在枚举集合时(在循环中),不能修改该集合。

您需要将更改添加到集合中,然后分别更改它们。比如:

1
2
3
4
5
6
7
8
var itemsToChange = dictionary
    .Where(d => d.Value =="red")
    .ToDictionary(d => d.Key, d => d.Value);

foreach (var item in itemsToChange)
{
    dictionary[item.Key] ="blue";
}


如果要替换所有出现的"红色",则需要将keyValuePairs存储在列表中或类似的内容中:

1
2
3
4
var redEntries = dictionary.Where(e => e.Value =="red").ToList();
foreach (var entry in redEntries) {
    dictionary[entry.Key] ="blue";
}