2012-02-02 16 views
14

Duplicar posibles:
Nested “from” LINQ query expressed with extension methodsNiza cruz, limpio unirse en LINQ utilizando únicamente métodos de extensión

Estoy seguro de que esto se ha hecho antes, pero sinceramente no pude encontrar nada .

Tengo curiosidad ¿cuál sería la sintaxis equivalente para el siguiente utilizando sólo una función de los métodos de extensión LINQ:

var z1 = 
    from x in xs 
    from y in ys 
    select new { x, y }; 

puedo obtener los mismos resultados con este:

var z2 = xs.SelectMany(x => ys.Select(y => new { x, y })); 

Pero produce diferentes códigos IL, y el código es un poco intrincado y difícil de entender. ¿Hay una manera más limpia de hacer esto con los métodos de extensión?


Aquí es toda mi método de prueba como está escrito:

private void Test() 
{ 
    var xs = new[] { 1D, 2D, 3D }; 
    var ys = new[] { 4D, 5D, 6D }; 

    var z1 = 
     from x in xs 
     from y in ys 
     select new { x, y }; 

    var z2 = xs.SelectMany(x => ys.Select(y => new { x, y })); 
} 

Aquí está la [Editar: C# interp del] Código IL (usando ILSpy):

private void Test() 
{ 
    double[] xs = new double[] 
    { 
     1.0, 
     2.0, 
     3.0 
    }; 
    double[] ys = new double[] 
    { 
     4.0, 
     5.0, 
     6.0 
    }; 
    var z = 
     from x in xs 
     from y in ys 
     select new 
     { 
      x = x, 
      y = y 
     }; 
    var z2 = xs.SelectMany((double x) => 
     from y in ys 
     select new 
     { 
      x = x, 
      y = y 
     }); 
} 
+7

eh, ese no es el código il? –

+1

Parece una interpretación C# del desmontaje en lugar de IL. –

+4

Eric Lippert respondió más o menos a la misma pregunta hoy aquí: http://stackoverflow.com/questions/9115675/nested-from-linq-query-expressed-with-extension-methods/9117009#9117009 – hvd

Respuesta

33

Una forma sería :

var z2 = xs.SelectMany(x => ys, (x, y) => new {x, y}); 
+0

+1: Esta es probablemente la mejor solución. – Douglas

+1

@Magnus, esto es, +1 y gracias. No me di cuenta de que había una sobrecarga de 'SelectMany' que te permitía hacer eso. También aprendí, gracias al comentario anterior de @ Daniel, que puedo ver la versión del método de extensión en lugar de la sintaxis de la consulta en ILSpy, y me vino básicamente tu respuesta. – devuxer

6

Si realmente quieres utilice un único método de extensión LINQ, entonces otro candidato sería Join, con las funciones outerKeySelector y innerKeySelector definidas de modo que siempre produzcan valores iguales.

var z3 = xs.Join(ys, x => true, y => true, (x, y) => new { x, y }); 

Esto, sin embargo, probablemente dar código IL más enrevesada que la solución anidada from. A propósito, MSDN usa el from anidado en su ejemplo para una combinación cruzada; mira el primer fragmento de código en How to: Perform Custom Join Operations (C# Programming Guide).

Cuestiones relacionadas