2

我正在尝试搜索字典以查看它是否具有特定值,如果是则更改它。这是我的代码:

foreach (var d in dictionary)
{
    if (d.Value == "red")
    {
         d.Value = "blue";
    }
}

在Visual Studio中,当我逐步调试代码时,我可以看到它更改了值,然后当它到达foreach循环以再次重申时,它会引发异常

“集合已修改;枚举操作可能无法执行”

我该如何解决?

4

6 回答 6

5

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

// 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";
于 2013-03-20T15:33:31.417 回答
1
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";
    }
}
于 2013-03-20T15:39:01.703 回答
0

如果要替换所有出现的“红色”,则需要将 KeyValuePairs 存储在列表或类似的东西中:

var redEntries = dictionary.Where(e => e.Value == "red").ToList();
foreach (var entry in redEntries) {
    dictionary[entry.Key] = "blue";
}
于 2013-03-20T15:32:46.980 回答
0

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

您需要将更改添加到集合中,然后单独更改它们。就像是:

var itemsToChange = dictionary
    .Where(d => d.Value == "red")
    .ToDictionary(d => d.Key, d => d.Value);

foreach (var item in itemsToChange)
{
    dictionary[item.Key] = "blue";
}
于 2013-03-20T15:35:05.470 回答
0

您不能在foreach循环中修改您正在迭代的集合。如果你能做到这一点,它会带来几个问题,比如“我也用这个新增加的价值来运行它吗?”

相反,您应该这样做:

foreach( string key in dictionary.Keys )
{
    if( dictionary[key] == "red" )
    {
        dictionary[key] = "blue";
    }
}
于 2013-03-20T15:35:11.273 回答
0

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

请通读thisthis以获得更多理解。

于 2013-03-20T15:36:23.930 回答