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

时间:2009-01-06 14:05:37

标签: c# iterator

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

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

public static IEnumerator<int> It2() { 
    ...
}

是否有任何情况下调用It2与调用It1.GetEnumerator()不同?

是否有充分的理由将{iteror}定义为IEnumerator<T>而不是IEnumerable<T>?我能想到的唯一一个就是你实施IEnumerable<T>.GetEnumerator()时。

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

2 个答案:

答案 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);
         }
    }
}