2011-01-26 27 views
29

Env .: .NET4 C#¿Cómo combinar 2 listas usando LINQ?

Hola a todos,

quiero combinar estas 2 listas: { "A", "B", "C", "D" } y { "1", "2", "3" }

en éste:

{ "A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3", "D1", "D2", "D3" } 

Obviamente, podría utilizar bucles anidados. Pero me pregunto si LINQ puede ayudar. Por lo que tengo entendido, Zip() no es mi amigo en este caso, ¿verdad?

TIA,

+2

Por lo general, cuando se inicia algo como esto en LINQ, es benificial preguntar '¿Cómo voy a hacer esto si éstas eran las tablas de una base de datos' – SWeko

Respuesta

37

Esencialmente, usted desea generar un producto cartesiano y luego concatenar los elementos de cada 2 -tuple. Esto es más fácil de hacer en la consulta de sintaxis:

var cartesianConcat = from a in seq1 
         from b in seq2 
         select a + b; 
+1

Como Jon señaló, * I * encuentro esta respuesta la más legible entre las (a partir de este escrito) 3. En realidad, coincide con el bucle anidado que usaríamos sin LINQ, que otros pueden tomar como argumento NO elegir esta respuesta. Pero por supuesto, me encantaría poder marcar las 3 respuestas como aceptadas :-) –

59

Uso SelectMany cuando desee para formar el producto cartesiano de dos listas:

aList.SelectMany(a => bList.Select(b => a + b))

+1

Esto es tan elegante! ¡Esta es la razón por la que amo LINQ! – Chris

+0

+1, hermoso y conciso ... –

25

SelectMany es sin duda el enfoque correcto, si el uso de múltiples "de" cláusulas o con una llamada directa, pero aquí es una alternativa al uso de Hightechrider de ella:

var result = aList.SelectMany(a => bList, (a, b) => a + b); 

Encuentro personalmente más fácil de entender, ya que está más cerca de la versión "múltiple desde": para cada "a" en "aList", producimos una nueva secuencia, en este caso siempre es "bList". Para cada par (a, b) producido por la unión cartesiana, proyectamos un resultado que es solo la concatenación de los dos.

Para que quede claro: ambos enfoques funcionarán. Simplemente prefiero este :)

En cuanto a si esto es más claro que la sintaxis de la expresión de consulta ... No estoy seguro. I usualmente usa llamadas a métodos cuando solo se trata de usar un solo operador, pero para Join, GroupJoin, SelectMany y GroupBy, las expresiones de consulta simplifican las cosas. Probar ambos y ver qué se encuentre más fácil de leer :)

+9

Hola Jon, siempre he querido preguntarte, ¿con qué frecuencia estás en SO? :) –

+4

@The_Butcher: Oh, aparezco de vez en cuando ... –

+2

@The_Butcher: http://meta.stackexchange.com/questions/555/why-does-jon-skeet-never-sleep/566#566 –