使用 yield return
实现迭代器时,返回 IEnumerator
和返回 IEnumerable
有什么区别吗?
使用 yield return
实现迭代器时,返回 IEnumerator
和返回 IEnumerable
有什么区别吗?
IEnumerable
和IEnumerator
是两个不同的东西。
IEnumerable<T>
是可以迭代的序列。
IEnumerator<T>
是由IEnumerable<T>
返回的对象,用于迭代一次序列。
通常,只有在GetEnumerator()
方法中才能返回IEnumerator<T>
。
yield return
对于这两种类型的行为是相同的,唯一的区别在于返回IEnumerable<T>
的迭代器方法可以多次执行(每次枚举序列)。
有关此操作方式的更多信息,请参见Jon Skeet的文章。
yield return
方法返回其中一个的情况;我甚至不知道从返回 IEnumerator<T> 的函数中使用 yield return
是否可行。 - Sergey Kalinichenkoyield return
对两者的行为方式都是相同的。据我所知,他只是在问这两种类型之间的区别是什么。 - SLaks作为迭代器函数的实现者,它对你没有影响。更重要的是迭代器函数的使用者。
一般来说,人们更喜欢拥有一个 IEnumerable<T>
对象,因为你可以在其上进行 foreach 循环,如果你真的需要一个 IEnumerator<T>
对象,那么你可以从 IEnumerable<T>
对象的 GetEnumerator()
方法中获取一个。