是否有任何不可重复的IEnumerable类?

时间:2009-11-29 03:01:31

标签: .net ienumerable

是否存在任何不可重复的IEnumerable类?

不可重复我的意思是你无法安全地多次调用GetEnumerator或者调用GetEnumerator会产生可观察到的副作用。

3 个答案:

答案 0 :(得分:1)

IEnumerable(Of T)的实现可以出于任何原因返回他们认为合适的任何项目。如果一个人在相同的项目序列上调用GetEnumerator两次,然后继续循环通过两个枚举器,它们应该以相同的顺序产生相同的项目或抛出异常。有许多例程接受IEnumerable(Of T),并且如果给出一个不遵守此类合同的例程,将会严重失败。

如果我有我的druthers,IEnumerable将被分成一系列接口;基本的IEnumerable的枚举器将丢失Reset方法,并且不会传达重复性的特定承诺。新的IMultiEnumerable将返回一个带有Reset方法的枚举器,并保证多次传递将产生相同的数据;枚举器也可能支持它自己的GetEnumerator方法(我认为对于任何支持多遍枚举的类型都应该是实用的;唯一的成本是'start'指针,因此嵌套的枚举器将被重置为其原始位置创建)。

答案 1 :(得分:1)

File.ReadLines()确实会返回只能运行一次的IEnumerable<T>

答案 2 :(得分:0)

不,任何实现IEnumerable的表现良好的类都允许重复枚举。

要枚举不可重复的集合,您没有实现IEnumerable的类。相反,您有一个返回枚举器的方法。这样,枚举器而不是类保存集合,因此无法为同一集合调用GetEnumerator两次。要重复枚举器,您必须调用该方法来创建新集合。

这方面的一个例子是Enumerable.Range方法。它会动态创建范围的项目,因此范围不作为集合存在,这使得它不可重复。要再次枚举相同的范围,请调用该方法以创建具有相同边界的新范围。