8

私は現在、C#3.0 のすべての新機能を学ぼうとしています。LINQ を実践するための非常に優れたサンプルのコレクションを見つけましたが、Lambda に似たものを見つけることができません。

Lambda 関数を練習できる場所はありますか?

アップデート

LINQpad は、Linq を学習し (提案した人にとっては thx)、何らかの式で Lambda を少し使用するのに最適です。しかし、Lambda のより具体的な演習に興味があります。

4

3 に答える 3

6

LINQPadは LINQ を学習するための優れたツールです

于 2008-10-28T18:16:36.600 に答える
4

ラムダは、ひとたび理解すれば「理解」できるものです。現在デリゲートを使用している場合は、ラムダに置き換えることができます。また、System.Action<...>System.Func<...>、およびSystem.Predicate<...>追加は便利なショートカットです。ただし、構文を示すいくつかの例は役に立ちます (警告: それらは非常識ですが、関数を交換する方法を説明したかったのです):

public static void Main()
{
    // ToString is shown below for clarification
    Func<int,string,string> intAndString = (x, y) => x.ToString() + y.ToString();
    Func<bool, float, string> boolAndFloat = (x, y) => x.ToString() + y.ToString();

    // with declared
    Combine(13, "dog", intAndString);
    Combine(true, 37.893f, boolAndFloat);

    // inline
    Combine("a string", " with another", (s1, s2) => s1 + s2);
    // and multiline - note inclusion of return
    Combine(new[] { 1, 2, 3 }, new[] { 6, 7, 8 },
        (arr1, arr2) =>
        {
            var ret = "";
            foreach (var i in arr1)
            {
                ret += i.ToString();
            }
            foreach (var n in arr2)
            {
                ret += n.ToString();
            }

            return ret;
        }
    );

    // addition
    PerformOperation(2, 2, (x, y) => 2 + 2);
    // sum, multi-line
    PerformOperation(new[] { 1, 2, 3 }, new[] { 12, 13, 14 },
        (arr1, arr2) =>
        {
            var ret = 0;
            foreach (var i in arr1)
                ret += i;
            foreach (var i in arr2)
                ret += i;
            return ret;
        }
    );

    Console.ReadLine();

}

public static void Combine<TOne, TTwo>(TOne one, TTwo two, Func<TOne, TTwo, string> vd)
{
    Console.WriteLine("Appended: " + vd(one, two));
}

public static void PerformOperation<T,TResult>(T one, T two, Func<T, T, TResult> func)
{
    Console.WriteLine("{0} operation {1} is {2}.", one, two, func(one,two));
}

ほとんどの場合、私を混乱させたのはショートカット構文でした。たとえば、System.Action を使用して、使用できるパラメーターなしでデリゲートを実行する場合などです。

var a = new Action(() => Console.WriteLine("Yay!"));

または、次のようにすることもできます。

Action a = () => Console.WriteLine("Yay");

ActionFunc、またはPredicateが 1 つの引数を取る場合は、括弧を省略できます。

var f = new Func<int, bool>(anInt => anInt > 0);

また:

// note: no var here, explicit declaration
Func<int,bool> f = anInt => anInt > 0;

それ以外の:

Func<int,bool> f = (anInt) => anInt > 0;

または極端に行く:

Func<int,bool> f = (anInt) =>
{
    return anInt > 0;
}

上記のように、単一行のラムダには return ステートメントは必要ありませんが、複数行のラムダには必要Funcです。

ラムダの使用方法を学ぶ最善の方法は、コレクションで多くの作業を行い、使用する名前空間に System.Linq を含めることだと思います。コレクションの拡張メソッドが大量に表示され、これらのメソッドのほとんどを使用すると、ラムダの知識を行使してください。

于 2008-10-28T19:01:38.273 に答える
1

私が見つけた最高のものは、現時点ではこのリンクです。練習に合わせたクイズですが、LINQ よりも Lambda の方が多いものがいいと思います。

于 2008-10-28T19:26:34.197 に答える