Digamos que usted tiene el siguiente código:Cómo insertar una lambda en una expresión LINQ consulta declarativa
string encoded="9,8,5,4,9";
// Parse the encoded string into a collection of numbers
var nums=from string s in encoded.Split(',')
select int.Parse(s);
Eso es fácil, pero lo que si quiero aplicar una expresión lambda a s en la selección, pero todavía mantener esto como una expresión de consulta declarativa, en otras palabras:
string encoded="9,8,5,4,9";
// Parse the encoded string into a collection of numbers
var nums=from string s in encoded.Split(',')
select (s => {/* do something more complex with s and return an int */});
Esto por supuesto no se compila. Pero, ¿cómo puedo obtener una lambda allí sin cambiar esto a sintaxis fluida.
actualización: Gracias a la orientación de StriplingWarrior, tengo una solución complicada, pero compilables:
var result=from string s in test.Split(',')
select ((Func<int>)
(() => {string u="1"+s+"2"; return int.Parse(u);}))();
La clave está en el yeso a un Func<string,int>
seguido de la evaluación de la lambda para cada iteración del selecto con (s)
. ¿Alguien puede encontrar algo más simple (es decir, sin el elenco de Func seguido de su evaluación o tal vez algo menos detallado que logra el mismo resultado final manteniendo la sintaxis de la expresión de consulta)?
Nota: El contenido de lambda anterior es de naturaleza trivial y ejemplar. Por favor no lo cambies.
Actualización 2: Sí, soy yo, loco Mike, de vuelta con una alternativa de solución (más bonita?) A esto:
public static class Lambda
{
public static U Wrap<U>(Func<U> f)
{
return f();
}
}
...
// Then in some function, in some class, in a galaxy far far away:
// Look what we can do with no casts
var res=from string s in test.Split(',')
select Lambda.Wrap(() => {string u="1"+s+"2"; return int.Parse(u);});
Creo que esto resuelve el problema sin el reparto y parenarrhea feo. ¿Hay algo así como el método genérico Lambda.Wrap ya presente en algún lugar del Framework .NET 4.0, para que no tenga que reinventar la rueda? Para no sobrecargar esta discusión, he trasladado este punto a su propia pregunta: Does this "Wrap" generic method exist in .NET 4.0.
No entiendo por qué alguien pueda desear utilizar la sintaxis declarativa. Su semejanza con sql parece confundir a los recién llegados con linq más de lo que les ayuda a entender qué es linq. Pero una buena pregunta de todos modos. +1 –
@klausbyskov, ha habido muchas preguntas sobre el "por qué" en SO que han sido respondidas. Me preocupa menos abordar el porqué de esta pregunta y solo quiero una respuesta al "cómo", si es posible. De acuerdo, mi ejemplo no es el mejor candidato para una sintaxis fluida, pero quería utilizar un ejemplo simple para no complicar demasiado mi pregunta. –
La sintaxis declarativa es útil cuando tienes varios 'join's o' from's, que de otra manera necesitarían algunos tipos anónimos codificados a mano muy sucios. – StriplingWarrior