C# 在c语言中使用字典时出错#
我试图搜索字典,看看它是否有一定的价值,如果有,然后改变它。 这是我的密码:C# 在c语言中使用字典时出错#,c#,asp.net,exception,dictionary,C#,Asp.net,Exception,Dictionary,我试图搜索字典,看看它是否有一定的价值,如果有,然后改变它。 这是我的密码: foreach (var d in dictionary) { if (d.Value == "red") { d.Value = "blue"; } } 在VisualStudio中,当我逐步调试代码时,我可以看到它更改了值,然后当它再次点击foreach循环进行重申时,它会抛出一个异常 “集合已修改;枚举操作可能无法执行” 如何修复此问题?如果要替换所有出现的“红色”,则
foreach (var d in dictionary)
{
if (d.Value == "red")
{
d.Value = "blue";
}
}
在VisualStudio中,当我逐步调试代码时,我可以看到它更改了值,然后当它再次点击foreach循环进行重申时,它会抛出一个异常
“集合已修改;枚举操作可能无法执行”
如何修复此问题?如果要替换所有出现的“红色”,则需要将KeyValuePairs存储在列表或类似列表中:
var redEntries = dictionary.Where(e => e.Value == "red").ToList();
foreach (var entry in redEntries) {
dictionary[entry.Key] = "blue";
}
你不能在前段时间改变它——你需要想出一些其他的机制,比如:
// 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 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";
}
}
foreach循环中的对象是只读的 请通读并进一步理解。
var dict=new Dictionary()
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(dict.Keys.ToArray()中的var键)
{
如果(dict[键]=“红色”)
{
dict[key]=“蓝色”;
}
}
这适用于简单的情况,正如这里所问的那样。然而,如果涉及的不仅仅是一个简单的值检查,那么这也不会起作用。您喜欢这种方法有什么原因吗?这种方法可能会将内存使用量增加一倍,而不是像我建议的那样(迭代密钥)?@mattytommo这是一个列表
-kvp将是一个KeyValuePair,并具有密钥属性。这是因为Dictionary
是IEnumerable
-@Jeff您的解决方案实际上给出了完全相同的错误-您不能在枚举键时更改字典…这是正确的,但毫无帮助。你已经告诉了他问题是什么,但没有给出解决问题的线索。@Jeff纠正Jeff,也应该发布解决方案。粘贴这两个链接以帮助Brian理解底层机制。这会产生相同的错误。您必须复制键才能进行枚举。这是可行的,但是在这里制作字典比在列表中制作字典要贵得多。ReedCopsey到底有多贵?它们都有一些开销,但我敢打赌成本上的差异很小。如果我没记错的话,一个字典在堆上有5个额外的托管分配,加上你要为循环和提取键和值等所需的闭包创建类。对大多数事情来说可能并不重要,但它比一个简单的列表要复杂得多。你是对的,在大多数情况下,它可能根本不明显,但它是一个更复杂的问题。