2011-01-26 15 views
29

Env .: .NET4 C#Come combinare 2 liste usando LINQ?

Ciao a tutti,

voglio combinare questi 2 elenchi: { "A", "B", "C", "D" } e { "1", "2", "3" }

in questo:

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

Ovviamente, potrei usare loop annidati. Ma mi chiedo se LINQ può aiutare. Per quanto ho capito, Zip() non è mio amico in questo caso, giusto?

TIA,

+2

Di solito quando si inizia qualcosa di simile in LINQ, è benificial chiedere 'Come farei questo se questi sono stati tabelle di un database' – SWeko

risposta

37

In sostanza, si desidera generare un prodotto cartesiano e poi concatenare gli elementi di ogni 2 -tuple. Questo è più facile da fare nella query-sintassi:

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

Come Jon ha sottolineato, * I * trova questa risposta la più leggibile tra (al momento della stesura) 3. In realtà, corrisponde al ciclo annidato che useremmo senza LINQ, che altri potrebbero prendere come argomento per NON scegliere questa risposta. Ma ovviamente, mi piacerebbe essere in grado di contrassegnare le 3 risposte come accettate :-) –

59

Usa SelectMany quando si desidera formare il prodotto cartesiano di due liste:

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

+1

Questo è così elegante! Questo è il motivo per cui amo LINQ! – Chris

+0

+1, bello e conciso ... –

25

SelectMany è sicuramente l'approccio giusto, sia che si utilizzi più "da" clausole o con una chiamata diretta, ma ecco un'alternativa all'uso di Hightechrider di esso:

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

Personalmente trovo questo più facile da capire in quanto è più vicino alla versione "multipla da": per ogni "a" in "elenco", produciamo una nuova sequenza - in questo caso è sempre "bList". Per ciascuna coppia (a, b) prodotta dall'unione cartesiana, proiettiamo un risultato che è solo la concatenazione dei due.

Giusto per essere chiari: entrambi gli approcci funzioneranno. Preferisco solo questo :)

Se questo è più chiaro della sintassi di espressione della query ... Non sono sicuro. I in genere utilizza le chiamate di metodo quando si tratta solo dell'utilizzo di un singolo operatore, ma per Join, GroupJoin, SelectMany e GroupBy, le espressioni di query semplificano le cose. Prova entrambi e vedere quale si trovare più leggibile :)

+9

Ehi Jon, hai sempre voluto chiedere, quanto spesso sei su SO? :) –

+4

@The_Butcher: Oh, vi compongo ogni tanto ... –

+2

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

Problemi correlati