2010-03-30 5 views
7

Tengo la siguiente declaración LINQ y quiero reescribirla usando métodos de extensión.¿Cuál es la forma elegante de reescribir la siguiente declaración LINQ utilizando métodos de extensión?

from x in e 
from y in e 
from z in e 
select new { x, z } 

Una posible solución es:

e.Join(e, x => 42, y => 42, (x, y) => new { x, y }) 
    Join(e, _ => 42, z => 42, (_, z) => new { _.x, z }); 

Sin embargo, esto es todo menos elegante.

¿Alguna idea de cómo mejorar la belleza de la segunda expresión?

+0

¿Realmente utilizan la misma secuencia en las tres cláusulas 'from'? –

+2

+1 para la etiqueta 'beauty' :-) –

+0

@Jon Skeet: Sí, esa es la intención. Este ejemplo particular proviene de Eric Mayers channel9 video conferencia sobre programación funcional. http://channel9.msdn.com/tags/Functional+Programming/ –

Respuesta

6
e.SelectMany(x => e.SelectMany(y => e.Select(z => new { x, z }))) 
6

El uso de Join es el enfoque incorrecto IMO.

El equivalente directo de esto es (creo!):

e.SelectMany(x => e.SelectMany(y => e.Select(new { y, z }), 
      (x, yz) => new { x, yz.z })) 

Aunque que sería equivalente a:

e.SelectMany(x => e.SelectMany(y => e.Select(new { x, z }))) 
+0

En el sentido de belleza, "Join" es claramente un enfoque equivocado. En el sentido de corrección, la intuición del álgebra relacional (SQL) me dice que esto debería estar bien. –

+0

@Jakub: Podría funcionar, pero eso no lo convierte en el enfoque correcto. El equivalente de LINQ de una combinación cruzada (es decir, donde no hay "claves" como tales) no es 'Join ', es' SelectMany'), a pesar de que 'SelectMany' proporciona más funcionalidad que esta. –

+0

¿Faltan estos cada paréntesis? –

Cuestiones relacionadas