C# で、デリゲート (delegate) 使うメリットを考えてみます。今回は、前回の匿名メソッドサンプルをラムダ式を使って書き換えてみます。
■ サンプルの概要
0 ~ 10 までの数字から特定の条件に合致する数字を出力します。具体的には次の仕様です。
- button 1 をクリックすると、2 で割り切れる数字だけをコピーします。
- button 2 をクリックすると、7 以上の数字だけをコピーします。
■ 前回のサンプル (C#)
delegate bool LT(int i); private void button1_Click(object sender, EventArgs e) { ListCopy(delegate(int i) { return ((i % 2) == 0) ? true : false; }); } private void button2_Click(object sender, EventArgs e) { ListCopy(delegate(int i) { return (i >= 7) ? true : false; }); } private void ListCopy(LT NumMethod) { bool bRet = true; for (int i = 0; i < 11; i++) { bRet = NumMethod(i); if (bRet) Console.WriteLine(i); } }
■ ラムダ式を使ったサンプル (C#)
ラムダ式を使うと匿名メソッドのコード量を減らすことができます。匿名メソッドを使うこと自体はメリットとデメリットがありますが、一度使うと決めた場合には、匿名メソッドを使うよりもラムダ式を使うほうが良いと思います。
delegate bool LT(int i); private void button1_Click(object sender, EventArgs e) { ListCopy((int i) => ((i % 2) == 0) ? true : false); } private void button2_Click(object sender, EventArgs e) { ListCopy((int i) => (i >= 7) ? true : false); } private void ListCopy(LT NumMethod) { bool bRet = true; for (int i = 0; i < 11; i++) { bRet = NumMethod(i); if (bRet) listBox1.Items.Add(i); } }
結果
動作確認環境
Visual Studio 2015 Professional (C# 6.0)
2. フォーム (Form1) にリストボックス (listBox1) を配置します。