在枚举通过它时修改.NET字典

我正在使用一个字典,我希望在我枚举它时更改它,但似乎这是不允许的。 我怎样才能做到这一点?

谢谢

您应该存储要删除的键或对象并中断循环,然后使用remove方法从字典中删除该对象。

希望这可以帮助

基本上不要。 它明确不受支持。 来自Dictionary<,>.GetEnumerator()的文档:

只要集合保持不变,枚举器仍然有效。 如果对集合进行了更改(例如添加,修改或删除元素),则枚举数将无法恢复,并且其行为未定义。

通常,最好的方法是记住您要进行的修改,然后再执行它们。 或者您可以从字典的副本开始,然后在修改原始字体时迭代 。 如果您可以向我们提供有关您尝试做什么的更多信息,那将有所帮助。

话虽如此,.NET 4.0 的新ConcurrentDictionary确实允许这样做 – 但是迭代的结果不能得到保证 – 您可能会在迭代时看到更改,或者您可能没有。

我在这里回答了队列,但答案是一样的。 您不能使用foreach枚举并同时修改集合。

我在工作中遇到了类似的情况。 我需要修改一个字典,同时迭代地使它变小,直到我没有键/值。

我开始创建一个“要删除”键的列表,但是我必须实现所有其他逻辑,这是非常缓慢的。 或者,我最后向后遍历字典。 由于您从后到前遍历字典,因此迭代不会引发错误。

在我拿出与工作相关的逻辑后,它看起来很傻,但我保证它有效并且看起来像:

  Dictionary> dict = new Dictionary>(); while(dict.Any()) { foreach(var key in dict.Keys.Reverse()) { if(//conditional) { dict.Remove(key); } else { //do something with dict[key] } } }