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循环中的对象是只读的。
请通读这篇和这篇,以获得更多的理解。
您不能在
相反,您应该这样做:
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"; } |