所以我有一个Dictionary<string, bool>
,我只想对它进行迭代,并将字典中的所有值设置为false。最简单的方法是什么?
我试过这个:
foreach (string key in parameterDictionary.Keys)
parameterDictionary[key] = false;
然而,我得到了错误:"集合已被修改;枚举操作可能无法执行。"
有更好的方法吗?
只需将枚举源更改为字典以外的内容。
foreach (string key in parameterDictionary.Keys.ToList())
parameterDictionary[key] = false;
对于.net 2.0
foreach (string key in new List<TKey>(parameterDictionary.Keys))
parameterDictionary[key] = false;
在.net 5中,以下代码段不再抛出:
var d = new Dictionary<string, int> { { "a", 0 }, { "b", 0 }, { "c", 0 }};
foreach (var k in d.Keys){
d[k] = 1;
}
有时在使用foreach
和.ForEach
循环时会遇到这种情况。使用for循环可以使用字典自己的密钥集合:
for(int i = 0; i < parameterDictionary.Count; ++i) {
var kvp = parameterDictionary.ElementAt(i); // using System.Linq;
parameterDictionary[kvp.Key] = false;
}
**编辑**
人们似乎对我的答案感到不安,尽管我不知道该怎么办,所以我写了一把小提琴来支持我的代码:
https://dotnetfiddle.net/U9EsNO
票据
- 尝试在foreach中编辑字典自己的值将导致
InvalidOperationException
- 你看,我用for循环来克服这个错误
- 将密钥集合复制到另一个变量总是完全可以接受的
**编辑2*
感谢@DStanley,我对反对票有了更多的了解,并对我的回答进行了适当的编辑。编码快乐!