2009-10-05 41 views
0

什麼是精確在.Net中Enumerable.Range的實現;最好.Net 4?這是一個for-loop嗎?自定義實現(IEnumerable,IEnumerator)還是?Enumerable.Range實現

+5

你爲什麼在意? – 2009-10-05 13:43:25

+2

用反射器反編譯http://www.red-gate.com/products/reflector/ – 2009-10-05 13:45:51

+0

我關心這個的原因是因爲我想知道實現的效率以及如何創建我自己的實現例如Int64和你有什麼。 – 2009-10-05 15:09:11

回答

1

accepted answer這個question應該給你答案:

public static class Enumerable { 
    public static IEnumerable<int> Range(int start, int count) { 
     var end = start + count; 
     for(var current = start; current < end; ++current) { 
      yield return current; 
     } 
    } 
} 

這不是確切代碼,因爲有很多錯誤檢查等Range方法中發生的情況,以及在內部,它調用其他方法,但是,上面引用的代碼是Range例程的「本質」。

檢查代碼Reflector應該爲您提供更多信息。

+0

我不想要精華,我想要精確的答案 - 但我明白,由於許可限制,這是不可能的。感謝您的輸入,我現在使用了反射器並找到了答案。 – 2009-10-05 15:08:17

+0

更像是:'if(!valid)throw exception;否則返回RangeInternal(...);'其中'RangeInternal'是一個迭代器。這是一個重要的區別,因爲如果你用無效參數調用'Range',你會立即得到異常。如果'Range'方法直接使用'yield',那麼在您收集集合之前您沒有例外。 – 2009-10-05 19:02:25

+0

@Mehrdad - 這是一個非常好的例子,它可以立即拋出異常(而不是延遲),就像迭代本身一樣。當我提到錯誤檢查時,這就是我所指的,但是您已經更清楚地描述了它。 – CraigTP 2009-10-05 19:17:58

1

您可以使用Reflector來查看自己的實現。它在調用時檢查參數並拋出異常,所以Range方法本身不是迭代器方法。它調用另一個迭代器方法。由於license restrictions,發佈確切的代碼並不好。

1

在反射器輸出的輕微但顯著差異(以及參數檢查,並CraigTP的回答和評論提到內在的額外級):

public static IEnumerable<int> Range(int start, int count) { 
    for(int current = 0; current < count; ++current) { 
     yield return start + current; 
    } 
} 

也就是說,而不是另一個局部變量,他們爲每個收益額外增加一項。