ラムダ式の利用 - 式形式で記述したラムダ式の定義と利用 - C#

C# 3.0で追加されたラムダ式を利用したコードを紹介します。

概要

式形式でラムダ式を定義する場合は、
(引数1, 引数2, ...) => 式
と記述します。
補足
式の部分に複数の処理を記述する場合は、ステートメント形式のラムダ式を用います。ステートメント形式のラムダ式の記述はこちらの記事を参照してください。

プログラム1

UI

Windows Formアプリケーションで以下のUIを作成します。TextBoxとButtonを配置します。

コード

以下のコードを記述します。

FormMain.cs

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 button1_Click(object sender, EventArgs e)
    {
      Func<int, int, bool> func1 = (a, b) => a == b;

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

解説

下記コードがラムダ式の定義部分です。引数を2つ持ち戻り値を返すデリゲートをラムダ式で定義します。今回は Func<int, int, bool> 型で定義したため、intの引数2つを与え、戻り値がboolのデリゲートを定義しています。
Func<int, int, bool> func1 = (a, b) => a == b;


以下のコードラムダ式になります。a,b 2つの引数を受け取りa,bを比較します。同じ値ならばtrueを返し、異なる値ならばfalseを返します。
(a, b) => a == b

ラムダ式で定義されたデリゲートを呼び出すコードです。一般的な関数やメソッドの呼び出しと同じ書式で記述できます。
textBox1.Text += func1(4, 3) +"\r\n";

Funcによるデリゲートの定義に関する説明はこちらのページを参照してください。
Func<int, int, bool> func1 

実行結果

プロジェクトを実行します。下図の画面が表示されます。


ボタンをクリックします。テキストボックスに結果が表示されます。


  textBox1.Text += func1(4, 3) +"\r\n";
  textBox1.Text += func1(2, 4) + "\r\n";
  textBox1.Text += func1(1, 1) + "\r\n";
  textBox1.Text += func1(-5, 8) + "\r\n";
  textBox1.Text += func1(9, 9) + "\r\n";
のコードのうち、2つの引数の値が同じもの(3番目と5番目)がTrueの結果になっています。

プログラム2

UI

下図のUIを作成します。使用するコントロールはButton3とTextBoxです。

コード

下記のコードを記述します。
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 button3_Click(object sender, EventArgs e)
    {
      Func<int, int> func1 = (a) => a*a;

      textBox1.Text += func1(4) + "\r\n";
      textBox1.Text += func1(2) + "\r\n";
      textBox1.Text += func1(1) + "\r\n";
      textBox1.Text += func1(-5) + "\r\n";
      textBox1.Text += func1(9) + "\r\n";
    }
  }
}

解説

下記のコードでは、引数の2乗を返すデリゲートになっています。"{"を利用しない式形式の場合は演算の結果が戻り値になります。
  Func<int, int> func1 = (a) => a*a;

一方、複数行でラムダ式を記述する場合は、戻り値にreturn文が必要になります。
参考コード
ラムダ式の実装部を複数行で記述する場合は下図のコードになります。return文が必要になります。
    private void button3_Click(object sender, EventArgs e)
    {
      Func<int, int> func1 = (a) => 
      {
        int b = a*a;
        return b;
      };

      textBox1.Text += func1(4) + "\r\n";
      textBox1.Text += func1(2) + "\r\n";
      textBox1.Text += func1(1) + "\r\n";
      textBox1.Text += func1(-5) + "\r\n";
      textBox1.Text += func1(9) + "\r\n";
    }

実行結果

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


button3をクリックします。引数を2乗した数値がテキストボックスに表示されます。


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