在枚举通过它时修改.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] } } }