考虑具有相同实体的两个迭代器方法:
public static IEnumerable<int> It1() {
...
}
public static IEnumerator<int> It2() {
...
}
是否有任何情况下调用It2
与调用It1.GetEnumerator()
不同?
是否有充分的理由将{iteror}定义为IEnumerator<T>
而不是IEnumerable<T>
?我能想到的唯一一个就是你实施IEnumerable<T>.GetEnumerator()
时。
编辑:通过迭代器方法我的意思是使用yield return
和yield break
构造的方法。
答案 0 :(得分:8)
如上所述,您不能foreach
超过IEnumerator<T>
。因此,它很难集成到您希望迭代返回内容的代码中的位置。
此外,这里的不确定性是IEnumerable<T>
意味着是一个工厂,因此您可以生成IEnumerator<T>
的实现,这些实现与{{1}的集合的实现没有直接关联}}
现在更重要的是,LINQ的所有扩展方法都在T
之后工作,因此您希望通过返回它来使您的枚举尽可能易于使用。
答案 1 :(得分: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);
}
}
}