【C#】ラムダ式

ラムダ式

 * メソッドを宣言することなく、メソッドを簡略化にして記述できる

メソッドを普通に記述

int GetAge(Person p)
{
    return p.Age;
}

bool IsMale(Person p)
{
    return p.Sex == "Male";
}

メソッドをラムダ式で記述

(p) => p.Age

(p) => p.Sex == "Male"

※ 引数を1つの場合、括弧は省略できる( p => p.Age、p => p.Sex == "Male" )

■ 基本構文

 左辺 => 右辺

 * デリゲートとして呼び出されるメソッドのパラメータが入る

 デリゲートについては、以下に移動。
http://blogs.yahoo.co.jp/dk521123/20916739.html

1) 左辺

 * 基本的にパラメータは ( ) で囲む必要がある
 * パラメータが1つのみの場合は、( ) は省略可能
 * パラメータが複数の場合、各パラメータは「,」で区切る

2) 右辺

 * 式か文を指定する
 * 式の最後には、セミコロン(;)を付けない
 * 文は必ず { } (=ブロック)で囲む
 * 文において、戻り値が必要な場合には、returnキーワードで返却する値を明記

 左辺 => 式
 左辺 => { 文; 文; 文; } 

3) 「=>演算子」(「goes to」(ゴーズ・トゥ)と読む)

 * 「左辺のパラメータを入力して、右辺を実行する」って意味らしい

■ サンプル

例1

delegate int Plus(int a, int b);

static void Output(Plus f)
{
    MessageBox.Show(string.Format("1 + 2 = {0}", f(1, 2)));
}

private void button1_Click(object sender, EventArgs e)
{
    Output((a, b) => { return a + b; }); // 出力:Output by double: 123
}
参考資料
http://www.atmarkit.co.jp/fdotnet/rapidmaster/rapidmaster_01/rapidmaster_01.html

例2

delegate void PrintCounter(int number);

static void Main(string[] args)
{
    PrintCounter printer = 
       new PrintCounter(x => Console.WriteLine(string.Format("Counter:{0}.", x)));
    for (int i = 1; i <= 10; i++)
    {
        printer(i);
    }
}