返回IEnumerable <T>和IEnumerator <T>的迭代器方法之间有什么区别吗?

Ale*_*nov 7 c# iterator

考虑具有相同实体的两个迭代器方法:

public static IEnumerable<int> It1() { 
    ...
}

public static IEnumerator<int> It2() { 
    ...
}
Run Code Online (Sandbox Code Playgroud)

呼叫It2与呼叫有It1.GetEnumerator()什么不同吗?

是否有充分的理由将迭代器定义为IEnumerator<T>结束IEnumerable<T>?我能想到的唯一一个就是你实施的时候IEnumerable<T>.GetEnumerator().

编辑:通过迭代器方法我的意思是使用yield returnyield break构造的方法.

cas*_*One 8

如上所述,你无法foreach超越IEnumerator<T>.因此,它很难集成到您希望迭代返回的代码中的位置.

此外,这里的不足之处在于IEnumerable<T>它意味着是一个工厂,因此您可以生成IEnumerator<T>与该集合的实现没有直接关联的实现T.

现在更重要的是,LINQ的所有扩展方法都有效IEnumerable<T>,因此您希望通过返回它来使您的枚举尽可能易于使用.


Joh*_*zen 1

如果您想负责编写IEnumerable<T>包装类,您就可以这样做。

假设您有一个类想要无限地进行枚举:

public class EveryDateInTheFuture : IEnumerable<DateTime>
{
    public EveryDateInTheFuture() { this.StartDate = DateTime.Today; }

    public DateTime StartDate { get; set; }

    public IEnumerator<DateTime> GetEnumerator()
    {
         while (true)
         {
             yield return date;
             date = date.AddDays(1);
         }
    }
}
Run Code Online (Sandbox Code Playgroud)