社員みんなの写真

今更ながらラムダ式の便利さについて


マックシステム (2014.09.30 09:00) | メンバーの戯言|

こんにちは。
システム・ソリューション部の恩田です。

今回は、今更感がすごいですが、C# 3.0 (Visual C# 2008)で追加された
ラムダ式の便利さについてお伝えしたいと思います。

ラムダ式とは…

ラムダ式は、デリゲートまたは式ツリー型を作成するために使用できる匿名関数です。
ラムダ式を使用して、引数として渡された場合、または関数呼び出しの結果値として
返すことができるローカル関数を記述できます。
ラムダ式は、LINQクエリ式を記述する場合に特に便利です。
(MSDNより)

この説明だけではよくわからないので、簡単な例をご紹介します。例として、指定部署の労働時間の合計を算出します。
今回は以下のような社員クラスを使用します。

class Shain
{
    public string ShainId { get; set; }  // 社員ID
    public string ShainNm { get; set; }  // 社員名
    public string BushoCd { get; set; }  // 部署ID
    public decimal RodoJikan { get; set; } // 労働時間
}

★パターン①
通常のループを使用した算出方法です。
以下の処理ではループ内で、指定の部署に所属する社員のみの労働時間を加算して返します。

private static decimal GetTotal1(List<Shain> list, string bushoCd)
{
    decimal total = 0;
    foreach (var value in list)
    {
        if (value.BushoCd.Equals(bushoCd))
        {
             total += value.RodoJikan;
        }
    }
    return total;
}

★パターン②
ラムダ式をした算出方法です。
以下の処理では、Whereメソッド内で指定の部署に所属する社員を返し、
Sumメソッドで労働時間を加算して返します。

private static decimal GetTotal2(List<Shain> list, string bushoCd)
{
    decimal total = list.Where(shain => shain.BushoCd.Equals(bushoCd)).Sum(shain => shain.RodoJikan);
    return total;
}

ラムダ式は、型の推論により、データ型などわずらわしい記述を省いた形で記述することができます。
内部の処理としては以下のような匿名関数を使用した場合と同様です。

private static decimal GetTotal2(List<Shain> list, string bushoCd)
{
    decimal total = list
    .Where(delegate(Shain shain)
    {
        return shain.BushoCd.Equals(bushoCd);
    })
    .Sum(delegate(Shain shain)
    {
        return shain.RodoJikan;
    });
    return total;
}

★パターン③
おまけとしてLinqを使用した算出方法です。
内部の処理はラムダ式で記述した場合と同じです。
SQL文に慣れている場合は、この記述の方がわかりやすいかもしれません。

private static decimal GetTotal3(List<Shain> list, string bushoCd)
{
    decimal total = (from shain in list where shain.BushoCd.Equals(bushoCd)
                     select shain.RodoJikan).Sum();
    return total;
}

これだけでみるとループでも対して変わらないじゃんという方もいらっしゃるかと思いますが、
同じような計算処理が複数あると大変読みづらくなってしまいます。

ラムダ式を使用することで、少ない記述で読みやすいコードを書くことができます。
また、他でも対応している言語があります(バージョンにもよりますが)ので、
機会がありましたら試してみてはいかがでしょうか?