免责声明:我理解IEnumerable<T>
和IEnumerator<T>
之间的区别以及如何使用它们。这与this或this不重复。
这更像是一个设计问题 - 因为IEnumerator<T>
已经包含了可以枚举的所有必要信息(.Current
,.MoveNext()
),那么引入一个问题的重点是什么? type(IEnumerable<T>
),其唯一目的是返回前者的实例?
具体来说:
为什么foreach
无法设计为直接通过IEnumerator<T>
进行迭代,如下所示:
// foreach (var e in anEnumerator) { //... }
while (anEnumerator.MoveNext())
{
doSomething(anEnumerator.Current);
}
为什么Linq不能直接基于IEnumerator<T>
构建?
答案 0 :(得分:55)
两个接口各自代表非常不同的概念。 IEnumerable<T>
是“允许枚举”的东西,其中IEnumerator<T>
是枚举本身的表示。
如果要将这些合并在一起,则不可能同时枚举单个集合(没有其他一些机制)。例如,在数组上执行foreach
的两个线程将不再起作用,这在当前设计中是完全可以接受的。