2009年10月17日

【ラムダ式】 汎用デリゲートの使い方

ラムダ式の解説も終わりに近づいてきました。
今日はラムダ式に使える、汎用デリゲート型の一覧です。
ラムダ式の書き方のバリエーションと簡単な使い方をまとめました。
以下のコードを御覧ください。

class Program
{
    static void Main(string[] args)
    {
        // Func
        // 戻り値int  - 引数なし
        Func<int> func1 = () => 0;	
        // 戻り値int  - 引数(int)『引数の型を省略』
        Func<int, int> func2 = (x) => x * 2;
        // 戻り値int  - 引数(int)『引数の型を明示』
        Func<int, int> func3 = (int x) => x * 2;
        // 戻り値int  - 引数(int)『括弧を省略』
        Func<int, int> func4 = x => x * 2;
        // 戻り値int  - 引数(int)『ステートメント型』
        Func<int, int> func5 = (x) =>
        {
            return (x * 2);
        };
        // 戻り値string  - 引数(int, int, int, int)
        Func<int, int, int, int, string> func6 = (a, b, c, d) => (a + b + c + d).ToString();

        // Action
        // 戻り値void  - 引数なし『処理なしのラムダ式』
        Action action1 = () => { };
        // 戻り値void  - 引数なし
        Action action2 = () => Console.WriteLine("Hello!!");
        // 戻り値void  - 引数(string)
        Action<string> action3 = (message) => Console.WriteLine(message);
        // 戻り値void  - 引数(int, int, int, int)
        Action<int, int, int, int> action4 = (a, b, c, d) => Console.WriteLine(a + b + c + d);

        // Predicate<T>
        // 戻り値bool  - 引数(int)
        Predicate<int> predicate = (x) => x != 0;
        
        // MethodInvoker(using System.Windows.Forms;が必要)
        // 戻り値void  - 引数なし
        MethodInvoker invoker = () => Console.WriteLine("Hello!!");

        // Comparison<T> T型配列のソート
        int[] intArray = { 1, 10, 3, 2, 100, 5, 4 };
        Comparison<int> comparison = (x, y) => { return (x - y); };// 昇順
        Array.Sort(intArray, comparison);// ソート
        Array.ForEach(intArray, (x) => Console.Write("{0} ", x));// 結果表示
        Console.WriteLine();

        // Converter<TInput, TOutput> コレクションの各要素の型をTInput型からTOutput型に変換
        // Array クラスの ConvertAll メソッド、および List クラスの ConvertAll メソッドで使用される
        Converter<int, long> converter = (int x) => x * x;// int型→long型に変換するラムダ
        long[] longArray = Array.ConvertAll(intArray, converter);// long[]に変換
        Array.ForEach(longArray, (x) => Console.Write("{0} ", x));// 結果表示
    }
}
ラムダ式の引数が1つの場合に限り、括弧を省略できる。(上記のfunc4)
戻り値が無い場合は、ダミーのラムダ式を書ける。(上記のaction1)
Converter<TInput, TOutput>は、ArrayかListのConvertAll メソッドで使用する。(上記のconverter)
この辺りが少し分かりづらいですよね。

ラムダ式は上記の汎用デリゲート型以外にも、自分で定義した独自のデリゲート型が使えます。
デリゲート型名から使用方法が明確になるので、汎用デリゲートより独自デリゲートの方が良いのですが、
やはり定義せずに気軽に使えるのは大きいですね。
次回でラムダ式の記事は最後です。今まで出てきた特徴をまとめます。

ラムダ式の先頭記事へ
タグ:ラムダ式
posted by 吾一 at 22:50| 2. ラムダ式 | このブログの読者になる | 更新情報をチェックする
×

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