Lambda関数を練習する場所[閉まっている]
質問
現在、C#3.0のすべての新機能を習得しようとしています。 LINQを練習するためのサンプルの非常に素晴らしいコレクションを見つけましたが、 Lambdaに似たものが見つかりません。
Lambda関数を練習できる場所はありますか?
更新
LINQpadは、Linq(提案者にとってはthx)を学習し、いくつかの表現で少しLambdaを使用するのに最適です。しかし、Lambdaのより具体的な演習には興味があります。
解決
LINQPad は、LINQを学習するための優れたツールです
他のヒント
ラムダとは、頭をかき回すと<!> quot; get <!> quot;それ。現在デリゲートを使用している場合、それをラムダに置き換えることができます。また、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");
1つの引数を取るAction
、Func
、またはPredicate
がある場合は、括弧を省略できます:
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ステートメントを必要としません。
ラムダを使用する方法を学ぶ最良の方法は、コレクションで多くの作業を行い、使用している名前空間にSystem.Linqを含めることだと思います-コレクションおよびこれらのメソッドの多くの拡張メソッドが表示されますラムダの知識を行使できるようにします。
私が見つけた最高のものは、現時点ではリンクです。練習に出会ったクイズですが、もっとラムダを使い、LINQを減らしたいと思います。