Linq に Range ってメソッドがあった

Groovy クロージャが使える - お だ のスペース で Groovy の upto が C# には無いよな〜と書いたら、
コメントにて id:NyaRuRu さんに拡張メソッドで作れば出来る と教えていただいたのですが、
先日の わんくま同盟 大阪勉強会 #29 の 中 さんのセッション資料の中に、System.Linq.Enumerable.Range メソッドを使用している箇所がありました。
このメソッドで Groovy の upto と同じ事が出来そう。って事で、前回書いたコードを書きなおしてみる。

int totalClinks = 0;
int partyPeople = 100;
List<int> a = new List<int>();
for (int i = 1; i <= partyPeople; i++) a.Add(i);
a.ForEach(guestNumber => totalClinks += (guestNumber - 1));
Console.WriteLine(totalClinks);

は、

int totalClinks = 0;
int partyPeople = 100;
Enumerable.Range(1, partyPeople).ToList().ForEach(guestNumber => totalClinks += (guestNumber - 1));
Console.WriteLine(totalClinks);

になりました。

Enumerable.Range メソッドは拡張メソッドではないため 1.Range(partyPeople)とは書けないので、厳密には Groovy の upto の様には書けないけど、
標準で用意されているから、こっちを使おうと思う。


てか、System.Linq 名前空間ちゃんと見とかないとダメだな〜。結構便利なのが追加されてるのに全然気づいてない。。


※F#でも書いてみた

#light

let rec CalcClinks list =
    match list with
    | []    -> 0
    | guestNumber::nextList -> (guestNumber - 1) + CalcClinks nextList
printfn "%A" (CalcClinks [1..100])

見よう見真似なので、構文の意味も未だ理解してませんが、動きはなんとなく理解中。