2009-01-06 67 views
7

考虑两个迭代方法具有相同的机构:返回IEnumerable <T>和IEnumerator <T>的迭代器方法有什么区别吗?

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

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

是否有任何情况,其中调用It2是调用It1.GetEnumerator()不同?

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

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

+0

的方法严格地说实现不能相同。 – 2009-01-06 14:50:15

+0

当然可以。 public static IEnumerable It1(){ yield return 1; } public static IEnumerator It2(){ yield return 1; } – 2009-01-06 21:07:49

回答

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); 
     } 
    } 
} 
8

如上所述,您不能foreach超过IEnumerator<T>。正因为如此,它很难整合到代码中您想要遍历返回的代码中。

而且,这里的imporance是IEnumerable<T>意味着是一个工厂,这样就可以产生不直接挂钩的T集合的实施IEnumerator<T>实现。

现在更重要的是,所有LINQ的扩展方法的工作关闭IEnumerable<T>,所以你会想让你的枚举尽可能容易地通过返回。

相关问题