2009-04-23 16 views
5

Come posso unire 2 elenchi di uguale lunghezza (per produrre un terzo elenco di uguale lunghezza) in cui non voglio specificare una condizione ma semplicemente fare affidamento sull'ordine degli elementi in le 2 liste.Unire 2 elenchi per ordine invece di condizione in LINQ

Es come posso aderire:

{1,2,3,4} with {5,6,7,8} 

produrre:

{{1,5}, {2,6}, {3,7}, {4,8}} 

Ho provato quanto segue:

from i in new []{1,2,3,4} 
from j in new []{5,6,7,8} 
select new { i, j } 

ma questo produce un cross join. Quando uso join, devo sempre specificare "on".

risposta

15

Si potrebbe utilizzare Select nel primo elenco, utilizzare l'indice elemento e accedere all'elemento nella seconda lista:

var a = new [] {1,2,3,4}; 
var b = new [] {5,6,7,8}; 

var qry = a.Select((i, index) => new {i, j = b[index]}); 
+0

Ottima risposta. +1 –

+0

molto bello !!! :) – Ryan

0

C'è una soluzione a metà strada, se si desidera utilizzare la sintassi di query. A metà strada nel senso che è necessario utilizzare il metodo Select su entrambi gli elenchi per ottenere gli indici che verranno utilizzati nella clausola where.

int[] list1 = {1,2,3,4}; 
int[] list2 = {5,6,7,8}; 

var result = from item1 in list1.Select((value, index) => new {value, index}) 
      from item2 in list2.Select((value, index) => new {value, index}) 
      where item1.index == item2.index 
      select new {Value1 = item1.value, Value2 = item2.value}; 

Il vantaggio di questa soluzione è che non ci vorrà fallire se le liste hanno lunghezze diverse, come la soluzione utilizzando l'indicizzatore farebbe.

5

Se si utilizza .Net 4.0, è possibile utilizzare il metodo di estensione Zip e Tuples.

var a = new [] {1,2,3,4}; 
var b = new [] {5,6,7,8}; 

var result = a.Zip(b, (an, bn) => Tuple.Create(an, bn)); 

In alternativa, è possibile tenere come array:

var resultArr = a.Zip(b, (an, bn) => new []{an, bn}); 
Problemi correlati