7

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

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

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

是否有任何情况下 callIt2与 call 不同It1.GetEnumerator()

是否有充分的理由将迭代器定义为IEnumerator<T>over IEnumerable<T>?我唯一能想到的就是当你在实施IEnumerable<T>.GetEnumerator().

编辑:迭代器方法是指使用yield returnyield break构造的方法。

4

2 回答 2

8

如前所述,您不能foreach超过IEnumerator<T>. 因此,很难集成到代码中您想要迭代返回的内容的地方。

此外,这里的重要性在于它IEnumerable<T>是一个工厂,因此您可以生成IEnumerator<T>T.

现在更重要的是 LINQ 的所有扩展方法都可以正常工作IEnumerable<T>,因此您将希望通过返回它来使您的枚举尽可能易于使用。

于 2009-01-06T14:13:36.270 回答
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);
         }
    }
}
于 2011-12-14T07:42:27.603 回答