自己動手重新實現LINQ to Objects: 6 - Repeat

本文翻譯自Jon Skeet的系列博文“Edulinq”。

本篇原文地址:

http://msmvps.com/blogs/jon_skeet/archive/2010/12/24/reimplementing-linq-to-objects-part-6-repeat.aspx 


本文的主題是個無關緊要的方法,Repeat。關於Repeat,值得討論的內容比Empty還要少。寫這篇博文只是爲了保證這個系列的完整性。


Repeat是什麼?


Repeat是一個靜態的泛型方法,不是擴展方法,它只有一個簽名形式:


public
 static IEnumerable<TResult> Repeat<TResult>( 

    TResult element, 

    int count)


它返回一個序列,該序列中反覆的包含“count”個指定的元素,。Repeat只需要一個參數校驗:檢驗“count”不是負數。


我們要測試什麼呢?


需要測試的東西真的不多。我只想到了四個場景:
 

一個簡單的測試,把一個字符串重複三次

一個空序列(把一個元素重複0次)

一個多次包含null的序列(僅僅是爲了證明“element”可以爲null

用負數作爲“count”來證明參數校驗會被執行,而且是立即執行的


以上這幾點恐怕都不怎麼令人興起。


來動手實現吧!


在實現的時候我們唯一有可能做錯的事就是把參數校驗的代碼和迭代器代碼塊寫到一起。不過我們已經多次的做過“分割實現”了,所以我們肯定不會犯這個錯誤的。下面的代碼就是乏善可陳的Repeat方法的全部了:


public
 static IEnumerable<TResult> Repeat<TResult>(TResult element, int count) 

    if (count < 0

    { 

        throw new ArgumentOutOfRangeException("count"); 

    } 

    return RepeatImpl(element, count); 

private static IEnumerable<TResult> RepeatImpl<TResult>(TResult element, int count) 

    for (int i = 0; i < count; i++) 

    { 

        yield return element; 

    } 

}


這就是今天的全部內容了。其中值得指出的部分就是...沒有什麼值得指出的。


結論


其實沒有什麼結論可寫。下一次我們講CountLongCount,那裏面倒是有些有趣的東西可以細說。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章