ラムダ式の利用 - 式形式で記述したラムダ式の定義と利用
C# 3.0で追加されたラムダ式を利用したコードを紹介します。
概要
式形式でラムダ式を定義する場合は、
と記述します。
補足
式の部分に複数の処理を記述する場合は、ステートメント形式のラムダ式を用います。ステートメント形式のラムダ式の記述は
こちらの記事を参照してください。
プログラム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を返します。
ラムダ式で定義されたデリゲートを呼び出すコードです。一般的な関数やメソッドの呼び出しと同じ書式で記述できます。
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を愛用