当有IEnumerator <T>时,为什么IEnumerable <T>是必要的?

KFL*_*KFL 20 .net c# oop

免责声明:我明白之间的差别IEnumerable<T>,并 IEnumerator<T>和如何使用这两种.这与不重复.

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

再具体一点:

  1. 为什么不能foreach设计为直接迭代IEnumerator<T>,如下所示:

    // foreach (var e in anEnumerator) { //... }
    while (anEnumerator.MoveNext())
    {
        doSomething(anEnumerator.Current);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 为什么不能直接建立Linq IEnumerator<T>

Ree*_*sey 57

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

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

  • 简短的回答是`IEnumerable`代表`IEnumeration`实例的[工厂](http://en.wikipedia.org/wiki/Factory_%28object-oriented_programming%29). (24认同)
  • +1.您甚至不必涉及线程:同一集合上的嵌套枚举也不起作用. (10认同)