読者です 読者をやめる 読者になる 読者になる

集中力なら売り切れたよ

プログラミングや、将棋などについて書きます。

C#の匿名メソッドとラムダ式の使い方を勉強しました

以下のような判定処理を委譲するカウントメソッドを定義する。

static int Count(int[] numbers, Predicate<int> judge)
{
    int count = 0;
    foreach (int n in numbers) {
        if (judge(n)) {
            count++;
        }
    }
    return count;
}

C#2.0で追加された匿名メソッド、C#3.0で追加されたラムダ式を渡して実行する。

static void Main(string[] args)
{
    int[] numbers = System.Linq.Enumerable.Range(1, 40).ToArray();

    // 匿名メソッド(C# 2.0)
    // 後述するラムダ式のほうが簡潔に書けるので、
    // 互換性のためだけに残されている機能
    int count = Count(numbers, delegate(int n) { return n % 2 == 0; });
    Console.WriteLine(count); // => 20

    // ラムダ式(C# 3.0)を省略なしで書く
    count = Count(numbers, (int n) => { return n % 3 == 0; });
    Console.WriteLine(count); // => 13

    // ラムダ式の型と括弧とreturnは一つなら省略可能
    count = Count(numbers, n => n % 4 == 0);
    Console.WriteLine(count); // => 10
}

Rubyでyieldで処理を委譲したり、メソッドにブロックを渡す感覚とほぼ同じだとわかりました。