【发布时间】:2010-10-20 02:03:54
【问题描述】:
C#/.NET 4.0 中的一个新特性是,您可以在 foreach 中更改您的枚举,而不会出现异常。有关此更改的信息,请参阅 Paul Jackson 的博客条目 An Interesting Side-Effect of Concurrency: Removing Items from a Collection While Enumerating。
执行以下操作的最佳方法是什么?
foreach(var item in Enumerable)
{
foreach(var item2 in item.Enumerable)
{
item.Add(new item2)
}
}
通常我使用IList 作为缓存/缓冲区,直到foreach 结束,但有更好的方法吗?
【问题讨论】:
-
Hmm.. 你能指出我们这个变化的文档吗?枚举集合时,可枚举对象始终是不可变的。
-
这是一个主题的变体,促使史蒂夫·麦康奈尔建议never to monkey with the loop index。
-
我知道我在这里挖掘了一个非常古老的对话,但我会非常小心。只有新的并发集合在 foreach 中是可修改的——所有以前的集合类型,我想未来的大多数集合类型也将在枚举它们时仍然是不可变的。大量使用这个怪癖会有效地锁定你使用并发集合,因为如果你想在未来使用不同的集合,所有你怪异的 foreach 循环都会突然中断。
-
这个问题是专门询问并发集合的吗?还是它提出了一个更笼统的问题并仅出于对比而提及?
标签: c# .net list enumeration enumerable