2009年10月09日

【ラムダ式】 ラムダ式のメリット

今回は、ラムダ式を使うことによって得られるメリットについて考察します。
ラムダ式について最初から学びたい方は、前回の記事を御覧ください。
前回のコードでは、引数なし、戻り値なしのラムダ式を使用しましたが、今回のサンプルコードでは、引数のあるラムダ式を使用しています。
Action<int>型の変数には、引数int型、戻り値なしのラムダ式を代入出来ます。
(ちなみに、Action<int, int>ならint型2つ、Action<int, int, string>ならint型2つ、string型1つを引数に持つメソッドが代入可能)
では、以下のコードを御覧ください。

class Program
{
    static void HeavyJob(Action<int> report)
    {
        for (int i = 1; i <= 100; i++)
        {
            // 時間のかかる処理を実行していると仮定(50msecスリープ)
            System.Threading.Thread.Sleep(50);

            // 進捗状況を引数のラムダ式に通知する
            report(i);
        }
    }

    static void Main(string[] args)
    {
        // 進捗をパーセント表示するラムダ式
        Action<int> percentage = (int progress) =>
        {
            // コンソール画面のクリア
            Console.Clear();
            // 進捗率をパーセント表示
            Console.WriteLine("進捗率={0}%", progress);
        };

        // 進捗をアスタリスクの数で表示するラムダ式
        Action<int> asterisk = (int progress) =>
        {
            // 呼ばれるたびにアスタリスクを1つ増やす
            Console.Write("*");
        };

        // 引数に渡すラムダ式を変えて2回実行
        HeavyJob(percentage);
        HeavyJob(asterisk);

        // <結果>
        // 進捗率=100%
        // ****************************************************************************************************
    }
}
まず、HeavyJobメソッドは時間がかかる処理を行うメソッドを想定しています。
今回のサンプルコードでは、Sleepで50msec処理を停止させることで重い処理を表現しています。
これをfor文で100回ループさせ、その進捗状況をreportメソッド経由で通知するようになっています。
HeavyJobメソッドの引数はAction<int>型になっており、引数としてラムダ式を渡しています。
ラムダ式を渡すことで、メソッドを呼ぶ側でreportの挙動をカスタマイズするというのが今回の最大の目的です。

Mainメソッド側では、同じ型のラムダ式を2つ定義しています。
percentageとasteriskですね。
percentageラムダ式の方は引数で受け取った進捗率をパーセント表示で出力します。(進捗率=??%)
asteriskラムダ式の方では引数で受け取った進捗率をプログレスバー形式で出力します。(*****....)
HeavyJobメソッドに渡すラムダ式を変えることで、HeavyJobメソッドの内容を全く変更することなく、進捗率の表示方法を変えることが出来ました。

これが、最も基本的なラムダ式の使い方になります。
ラムダ式を渡すことによって、外部から処理をカスタマイズできる事を覚えておいてください。

ラムダ式 はじめの一歩へ戻る ラムダ式の次の記事へ
ラベル:ラムダ式
posted by 吾一 at 21:36| 2. ラムダ式 | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。