![](/img/trans.png)
[英]when implementing iterator, what's the difference between returning IEnumerator or IEnumerable?
[英]Is there any difference between iterator methods returning IEnumerable<T> and IEnumerator<T>?
考虑具有相同实体的两个迭代器方法:
public static IEnumerable<int> It1() {
...
}
public static IEnumerator<int> It2() {
...
}
是否存在调用It2
与调用It1.GetEnumerator()
不同的情况?
是否有充分的理由在IEnumerator<T>
IEnumerable<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);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.