0

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

例如

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);

如果listOfEntities是. 这将失败List<T>

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

4

2 回答 2

5

查看 System.Collections.Concurrent 中的集合。那里没有列表,但集合的枚举器确实“代表了 [集合] 内容的即时快照”。

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

于 2012-03-28T18:25:20.713 回答
4

这与List<T>; 这是枚举器的限制。如果您更改枚举器下方的集合状态,它将抛出句号。

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

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

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

于 2012-03-28T18:23:38.403 回答