我正在尝试搜索字典以查看它是否具有特定值,如果是则更改它。这是我的代码:
foreach (var d in dictionary)
{
if (d.Value == "red")
{
d.Value = "blue";
}
}
在Visual Studio中,当我逐步调试代码时,我可以看到它更改了值,然后当它到达foreach循环以再次重申时,它会引发异常
“集合已修改;枚举操作可能无法执行”
我该如何解决?
我正在尝试搜索字典以查看它是否具有特定值,如果是则更改它。这是我的代码:
foreach (var d in dictionary)
{
if (d.Value == "red")
{
d.Value = "blue";
}
}
在Visual Studio中,当我逐步调试代码时,我可以看到它更改了值,然后当它到达foreach循环以再次重申时,它会引发异常
“集合已修改;枚举操作可能无法执行”
我该如何解决?
你不能在 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";
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";
}
}
如果要替换所有出现的“红色”,则需要将 KeyValuePairs 存储在列表或类似的东西中:
var redEntries = dictionary.Where(e => e.Value == "red").ToList();
foreach (var entry in redEntries) {
dictionary[entry.Key] = "blue";
}
枚举时不能修改集合(在循环中)。
您需要将更改添加到集合中,然后单独更改它们。就像是:
var itemsToChange = dictionary
.Where(d => d.Value == "red")
.ToDictionary(d => d.Key, d => d.Value);
foreach (var item in itemsToChange)
{
dictionary[item.Key] = "blue";
}
您不能在foreach
循环中修改您正在迭代的集合。如果你能做到这一点,它会带来几个问题,比如“我也用这个新增加的价值来运行它吗?”
相反,您应该这样做:
foreach( string key in dictionary.Keys )
{
if( dictionary[key] == "red" )
{
dictionary[key] = "blue";
}
}