列表类型是否可以在更改时枚举?

时间:2012-03-28 18:15:23

标签: c# .net-4.0 asp.net-4.5

有时在列表更改时枚举列表很有用。

e.g。

foreach (var item in listOfEntities)
  item.Update();

// somewhere else (with someEntity contained in listOfEntities)
// an add or remove is made:
someEntity.OnUpdate += (s,e) => listOfEntities.Remove(someEntity);

如果listOfEntitiesList<T>,则会失败。

有一些解决方法,比如制作副本或简单的for循环,每个都有不同的缺点,但我想知道框架(或​​开源)中是否有支持这种情况的列表类型。

2 个答案:

答案 0 :(得分:5)

查看System.Collections.Concurrent中的集合。那里没有列表,但收藏品是&#39;枚举器&#34;表示[集合]&#34;的内容的时刻快照。

这些集合专为从多个线程进行访问而设计,因此它们更适合于您发布的代码示例等应用程序。

答案 1 :(得分:4)

这与List<T>无关;这是普查员的限制。如果你更改枚举器下面的集合的状态,它将抛出句点。

可以使用for循环,但是在项目数量发生变化后索引到集合时会遇到逻辑错误。

当您在另一个线程中枚举它时,将项目交换进出集合可能是一个坏主意。我会坚持使用经过验证的真实方法来记录要在另一个集合中删除的项目,或者在枚举时锁定集合。

我并不是说这是一个不可能解决的问题,我只是不知道一个简单的方法。