当存在IEnumerator <t>?</t> </t>时,为什么IEnumerable <t>是必要的

时间:2014-09-22 22:33:33

标签: c# .net oop

免责声明:我理解IEnumerable<T>IEnumerator<T>之间的区别以及如何使用它们。这与thisthis不重复。

这更像是一个设计问题 - 因为IEnumerator<T>已经包含了可以枚举的所有必要信息(.Current.MoveNext()),那么引入一个问题的重点是什么? type(IEnumerable<T>),其唯一目的是返回前者的实例?

具体来说:

  1. 为什么foreach无法设计为直接通过IEnumerator<T>进行迭代,如下所示:

    // foreach (var e in anEnumerator) { //... }
    while (anEnumerator.MoveNext())
    {
        doSomething(anEnumerator.Current);
    }
    
  2. 为什么Linq不能直接基于IEnumerator<T>构建?

1 个答案:

答案 0 :(得分:55)

两个接口各自代表非常不同的概念。 IEnumerable<T>是“允许枚举”的东西,其中IEnumerator<T>是枚举本身的表示。

如果要将这些合并在一起,则不可能同时枚举单个集合(没有其他一些机制)。例如,在数组上执行foreach的两个线程将不再起作用,这在当前设计中是完全可以接受的。