使用yield return
实现迭代器时,返回IEnumerator
和IEnumerable
之间有什么区别吗?
答案 0 :(得分:9)
IEnumerable
和IEnumerator
是两回事。
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根本无法成为广泛使用。