在枚举时修改.NET字典

Dim*_*eff 14 .net c#

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

谢谢

Jon*_*eet 10

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

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

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

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

  • MSDN文档*并没有*对此完全保持沉默。来自http://msdn.microsoft.com/zh-cn/library/dd287131(VS.100).aspx-“从字典返回的枚举器可以安全地与字典进行读写操作,但是不会表示字典的即时快照。通过枚举器公开的内容可能包含在调用GetEnumerator之后对字典所做的修改。” 不是完全沉默,是吗?我希望开发人员在特别需要并发时使用ConcurrentDictionary-并适当地使用它。 (2认同)
  • 还请注意,我并没有盲目地说“使用ConcurrentDictionary,它可以解决此问题”。我指定它“允许”并发迭代和修改,但也明确提到您可能会看到更改,也可能不会看到更改。我看不出这怎么会误导任何人。 (2认同)

Pra*_*ani 7

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

希望这可以帮助


小智 5

理想情况下,不建议这样做。迭代到下一项时调用的 GetEnumerator() 将抛出 InvalidOperationException。但是,从.netcore 3.1开始,当您在循环内部执行dictionary.Remove() 或dictionary.Clear() 时,这将起作用。

是文档。