Где попрактиковаться в лямбда-функции?[закрыто]
Вопрос
В настоящее время я пытаюсь изучить все новые возможности C # 3.0.Я нашел очень хорошую коллекцию образец для практики LINQ но я не могу найти что-то подобное для Lambda.
Есть ли у вас место, где я мог бы попрактиковаться в лямбда-функции?
Обновлять
LINQpad отлично подходит для изучения Linq (спасибо тому, кто подсказывает) и использования немного Lambda в некоторых выражениях.Но мне было бы интересно более конкретное упражнение для лямбды.
Решение
LINQPad - хороший инструмент для изучения LINQ
Другие советы
Лямбды — это просто то, что, как только вы разберетесь в этом, вы «поймете».Если вы сейчас используете делегат, вы можете заменить его лямбдой.Так же 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");
Когда у вас есть 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, хотя многострочные Func
лямбды делают.
Я думаю, что лучший способ научиться использовать лямбда-выражения — это много работать с коллекциями и включать System.Linq в используемые пространства имен — вы увидите массу методов расширения для ваших коллекций, и большинство из этих методов позволяют вам применить свои знания о лямбдах.
Лучшее, что я нашел, - это ссылка на данный момент. Это тест, который позволяет встретиться с практикой, но я хотел бы что-то более лямбда и меньше LINQ.