考虑具有相同实体的两个迭代器方法:
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 return和yield break构造的方法.
如上所述,你无法foreach超越IEnumerator<T>.因此,它很难集成到您希望迭代返回的代码中的位置.
此外,这里的不足之处在于IEnumerable<T>它意味着是一个工厂,因此您可以生成IEnumerator<T>与该集合的实现没有直接关联的实现T.
现在更重要的是,LINQ的所有扩展方法都有效IEnumerable<T>,因此您希望通过返回它来使您的枚举尽可能易于使用.
如果您想负责编写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)