C#のラムダ式をチェーンさせる記法が便利!

(この記事は,Hidden Features of C#?を参考に記述しています)

C#では、バージョン3.0(Visual C# 2008)以降でサポートされた、ラムダ式というものが有ります。
ラムダ式を使うことで、関数型プログラミングっぽい記述や、デリゲート・イベントハンドラを簡潔に記述することが出来ます。

このラムダ式ですが、実は複数のラムダ式を連結(チェーン)させることが可能です。

    //--------------------------------------------
    // 「dx,dyを渡すと、ハンドラ関数を返す」関数
    //--------------------------------------------
    Func<int, int, EventHandler> makeHandler = (dx, dy) => (sender, e) => {
            // クリックされた部品を取得する
            var btn = (Button) sender;
 
            // 指定された方向にボタンを移動させる
            btn.Top  += dy*5;
            btn.Left += dx*5;
        };
 
    //---------------------------------------------------
    // 各ボタンに対応したハンドラ関数を作って、登録する
    //---------------------------------------------------
    btnUp.Click    += makeHandler( 0, -1);
    btnDown.Click  += makeHandler( 0,  1);
    btnLeft.Click  += makeHandler(-1,  0);
    btnRight.Click += makeHandler( 1,  0);



上記サンプルの、makeHandlerで、ラムダ式のチェーンを行っています。

makeHandler()関数は、引数を2つ受け取るとEventHandlerクラスのラムダ返す処理です。
関数内では、makeHandlerの引数であるdx,dyと、EventHandlerの引数であるsenderが両方使用できるところがポイントです。

この記述をうまく活用すると、似たような処理を何度も書かずに済ます事ができるのが便利ですね。



本処理を使用したプロジェクトをダウンロードできるようにしておきます。
実際にデバッグ実行してみて、振る舞いを確認してみてください。


ダウンロード
LambdaChainTest.zip

関連記事

コメントを残す

メールアドレスが公開されることはありません。