在实现迭代器时,返回IEnumerator或IEnumerable之间有什么区别?

时间:2012-02-22 14:38:37

标签: c# .net c#-4.0

使用yield return实现迭代器时,返回IEnumeratorIEnumerable之间有什么区别吗?

3 个答案:

答案 0 :(得分:9)

IEnumerableIEnumerator是两回事。

IEnumerable<T>是一个可以迭代的序列。

IEnumerator<T>IEnumerable<T>返回的对象,在序列上迭代一次。

通常,返回IEnumerator<T>的唯一地方是GetEnumerator()方法。

对于两种类型,

yield return的行为方式相同,只是返回IEnumerable<T>的迭代器方法可以执行多次(每次枚举序列时)。
有关其工作原理的详细信息,请参阅Jon Skeet's article

答案 1 :(得分:1)

作为迭代器函数的实现者,它对您没有影响。这对迭代器函数的消费者更重要。

一般来说,人们更喜欢拥有IEnumerable<T>对象,因为你可以对它进行foreach循环,如果你真的需要一个IEnumerator<T>对象,那么你可以从{{IEnumerable<T>获得一个1}} object的GetEnumerator()方法。

答案 2 :(得分:0)

如SLaks所述,Enumerator可以迭代一次,IEnumerable可以生成任意数量的枚举器,允许底层集合多次迭代。

在实践中,主要区别在于有很多方法,例如LINQ,以及许多与集合进行交互的方法,这些方法都处理Enumerables,而不是Enumerators,因此Enumerator根本无法成为广泛使用。