返回IEnumerable< T>的迭代器方法之间是否有任何区别?和IEnumerator< T>?
题
考虑具有相同实体的两个迭代器方法:
public static IEnumerable<int> It1() {
...
}
public static IEnumerator<int> It2() {
...
}
是否存在调用 It2
与调用 It1.GetEnumerator()
不同的情况?
是否有充分的理由将 IEnumerator&lt; T&gt;
定义为迭代器?我能想到的唯一一个是你实现 IEnumerable&lt; T&gt; .GetEnumerator()
。
编辑:通过迭代器方法我的意思是使用 yield return
和 yield break
结构的方法。
解决方案
如果你想负责编写 IEnumerable&lt; T&gt;
包装类,你会这样做。
假设您有一个要无限制地进行枚举的类:
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);
}
}
}
其他提示
如上所述,您无法通过 IEnumerator&lt; T&gt;
foreach
。因此,它很难集成到您希望迭代返回内容的代码中的位置。
此外,这里的缺点是 IEnumerable&lt; T&gt;
是一个工厂,因此您可以生成 IEnumerator&lt; T&gt;
的实现直接绑定到 T
集合的实现。
现在更重要的是,LINQ的所有扩展方法都在 IEnumerable&lt; T&gt;
之后工作,所以你需要通过返回它来使你的枚举尽可能易于使用。
不隶属于 StackOverflow