2009-01-06 52 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>,所以你會想讓你的枚舉儘可能容易地通過返回。

相關問題