返回IEnumerable< T>的迭代器方法之间是否有任何区别?和IEnumerator< T>?

StackOverflow https://stackoverflow.com/questions/416651

  •  03-07-2019
  •  | 
  •  

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

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

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

是否存在调用 It2 与调用 It1.GetEnumerator()不同的情况?

是否有充分的理由将 IEnumerable&lt; T&gt; 上的 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; 之后工作,所以你需要通过返回它来使你的枚举尽可能易于使用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top