¿Dónde practicar la función Lambda?[cerrado]
Pregunta
Actualmente estoy intentando aprender todas las funciones nuevas de C#3.0.He encontrado una colección muy bonita de muestra para practicar LINQ pero no encuentro algo similar para Lambda.
¿Tiene algún lugar donde pueda practicar la función Lambda?
Actualizar
LINQpad es genial para aprender Linq (gracias por el que sugiere) y usar un poco de Lambda en alguna expresión.Pero me interesaría hacer un ejercicio más específico para Lambda.
Solución
LINQPad es una buena herramienta para aprender LINQ
Otros consejos
Las lambdas son algo que, una vez que entiendes, lo "entiendes".Si actualmente utiliza un delegado, puede reemplazarlo con una lambda.También el System.Action<...>
, System.Func<...>
, y System.Predicate<...>
Las adiciones son buenos atajos.Sin embargo, serían útiles algunos ejemplos que muestren la sintaxis (advertencia:son tontos pero quería ilustrar cómo se pueden intercambiar funciones):
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));
}
Principalmente lo que me confundió fue la sintaxis del acceso directo, por ejemplo cuando uso System.Action para simplemente ejecutar un delegado sin parámetros que puedas usar:
var a = new Action(() => Console.WriteLine("Yay!"));
O podrías hacer:
Action a = () => Console.WriteLine("Yay");
Cuando tienes un Action
, Func
, o Predicate
eso requiere un argumento, puedes omitir el paréntesis:
var f = new Func<int, bool>(anInt => anInt > 0);
o:
// note: no var here, explicit declaration
Func<int,bool> f = anInt => anInt > 0;
en lugar de:
Func<int,bool> f = (anInt) => anInt > 0;
o para ir al extremo:
Func<int,bool> f = (anInt) =>
{
return anInt > 0;
}
Como se muestra arriba, las lambdas de una sola línea no requieren la declaración de devolución, aunque las de varias líneas Func
las lambdas lo hacen.
Creo que encontrará que la mejor manera de aprender a usar lambdas es trabajar mucho con colecciones e incluir System.Linq en sus espacios de nombres de uso; verá un montón de métodos de extensión para sus colecciones y la mayoría de estos métodos le permitirán Ejercita tus conocimientos de lambdas.
Lo mejor que he encontrado es este enlace por el momento. Es un cuestionario que permite la práctica, pero me gustaría algo más Lambda y menos LINQ.