繁体   English   中英

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

[英]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 returnyield 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM