关于c#:为什么在迭代字典的项目并修改它们的值时,是否有必要暂时将密钥保存到列表中?

Why is it necessary to temporarily save keys to a list when iterating over a dictionary's items and modifying their values?

本问题已经有最佳答案,请猛点这里访问。

从这个答案:

1
2
3
4
foreach (var key in dict.Keys.ToList())
{
    dict[key] = false;
}

The call to ToList() makes this work, since it's pulling out and (temporarily) saving the list of keys, so the iteration works.

为什么有必要打电话给ToList()

我们修改的是值,而不是键,据我所知,只有修改字典的键集才能打破键的迭代。特别是,对我来说,可能是理解错误——只有在我们在字典中添加或删除项目时,键的顺序才能改变,而我们没有这样做。


如果您读取Dictionary.Insert的引用源,您将看到它正在增加version字段,该字段在枚举集合时驱动保护。


字典有内部版本号。

在字典中设置值将更新其版本号,其效果与在foreach循环中修改枚举集合的效果相同。