ラムダ式について最初から学びたい方は、前回の記事を御覧ください。
前回のコードでは、引数なし、戻り値なしのラムダ式を使用しましたが、今回のサンプルコードでは、引数のあるラムダ式を使用しています。
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メソッドの内容を全く変更することなく、進捗率の表示方法を変えることが出来ました。
これが、最も基本的なラムダ式の使い方になります。
ラムダ式を渡すことによって、外部から処理をカスタマイズできる事を覚えておいてください。
ラムダ式 はじめの一歩へ戻る ラムダ式の次の記事へ
ラベル:ラムダ式