Web検索はbingがおすすめ!

ラムダ式の利用 - ステートメントで記述したラムダ式の定義と利用 - C#

こちらの記事では処理が一行で済む場合の式形式のラムダ式の定義と利用方法を紹介しました。この記事では複数の処理をラムダ式で記述する場合のステートメント形式のラムダ式の記述方法を紹介します。

概要

ステートメントでラムダ式を定義する場合は、
(引数1, 引数2, ...) => {
  文1;
  文2;
  文3;
  ......
  文n;
};
と記述します。

多くの場合、ステートメントでラムダ式を利用する場合は、Func<T, TResult> , Action<T, TResult>と組み合わされて使用される場合が多いです。Func, Actionについてはこちらの記事を参照してください。

プログラム例1

UI

Windows Formアプリケーションを作成し、下図のUIを作成します。(Button1はフォームに配置してありますが利用しません。)

コード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SimpleLambdaExpressions
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
      Func<int, int, int, int> func1 = (a, b, c) => {
        int d = a + b;
        int r = d * c;
        return r;
      };

      textBox1.Text += func1(2, 1, 3) + "\r\n";
      textBox1.Text += func1(1, 4, 6) + "\r\n";
      textBox1.Text += func1(2, 5, 1) + "\r\n";
    }
  }
}

解説

  Func<int, int, int, int> func1 = (a, b, c) => {
    int d = a + b;
    int r = d * c;
    return r;
  };
冗長に記述してありますが、与えられた3つの引数a,b,cの (a+b)*c を返すラムダ式になります。Func<int, int, int, int>のデリゲートに関してはこちらの記事を参照してください。

  textBox1.Text += func1(2, 1, 3) + "\r\n";
  textBox1.Text += func1(1, 4, 6) + "\r\n";
  textBox1.Text += func1(2, 5, 1) + "\r\n";
ラムダ式のデリゲートを呼び出し、結果をテキストボックスに表示します。(a+b)*cの結果が表示されるため、"9","30","7"がテキストボックスに表示されれば、期待した動作となります。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[Button2]をクリックします。テキストボックスに結果が表示されました。

補足

ラムダ式を用いない記述方法では以下の通りとなります。
  Func<int, int, int, int> func1 = delegate(int a, int b, int c) {
    int d = a + b;
    int r = d * c;
    return r;
  };

プログラム例2

戻り値が無い場合の例です。

UI

下図のUIを作成します。(Buttonコントロールが4つありますが、利用するのは"button4"のみです。)

コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SimpleLambdaExpressions
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button4_Click(object sender, EventArgs e)
    {
      Action action1 = () =>
      {
        textBox1.Text += "ペンギン\r\n";
        textBox1.Text += "くじら\r\n";
        textBox1.Text += "らくだ\r\n";
      };

      action1();
    }
  }
}

解説

引数も受け取らず、戻り値も返さない場合の例です。戻り値を返さない場合はFuncではなく、Actionを利用します。
action1(); の呼び出しで、ラムダ式で定義された処理を実行します。

実行結果

プロジェクトを実行し、[button4]をクリックします。テキストボックスにコードで記述した文字列が表示されます。



著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2013-07-05
iPentec all rights reserverd.