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])
見よう見真似なので、構文の意味も未だ理解してませんが、動きはなんとなく理解中。