如果原始集合修改了.NET,枚举数将发生什么
||
我有一个通用的Tree类,它将实现ICollection (并因此实现IEnumerable 和IEnumerable)。
为此,我必须实现一个TreeEnumerator类。
每次对Tree.GetEnumerator()的调用都将返回TreeEnumerator的新实例。
我有两个问题:
如果周围有很多TreeEnumerator对象并且基础Tree发生了变化,那么会发生什么?如何处理?
创建TreeEnumerator时是否最好对所有树元素(在TreeEnumerator内部进行CopyToArray操作)以方便进行数组遍历,还是对每个MoveNext一次一次遍历?
我知道CopyToArray很容易进行一次遍历,但是会占用空间。
编辑:
了解版本机制后:
您能否指出这种版本控制机制的示例代码?必须有标准的命名方式和访问方式,因为foreach循环在每次MoveNext时都需要进行此检查
没有找到相关结果
已邀请:
3 个回复
豹芜澈
。) 请注意,.NET 4中的并发集合显式允许在不使迭代器无效的情况下更改集合。通常,迭代器只会看到原始元素,就像调用
时已拍摄快照一样。
砷竣阿
类)中处理此问题的方式是保留列表状态的版本号。无论何时以任何方式更改列表的内容,都会增加版本号。 枚举器包含版本号的副本,以便在需要访问列表时可以检查列表是否不变。 在创建枚举器时复制项目将避免需要版本计数器,但这也使创建枚举器变得昂贵。对于大多数集合而言,创建枚举数并不昂贵,因此,如果可能,您应尝试遵循这种行为。
扫窟