2009-04-23 13 views
5

¿Cómo puedo unir 2 listas de igual longitud (para producir una tercera lista de igual longitud) donde no quiero especificar una condición sino simplemente confiar en el orden de los elementos en las 2 listasUnir 2 listas por orden en lugar de condición en LINQ

por ejemplo, cómo me puedo unir:

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

para producir:

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

He intentado lo siguiente:

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

pero esto produce una combinación cruzada. Cuando uso join, siempre necesito especificar "on".

Respuesta

15

Usted podría utilizar Select en la primera lista, utilice el índice de elemento y acceder al elemento de la segunda 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

excelente respuesta. +1 –

+0

muy bueno! :) – Ryan

0

hay una solución a mitad de camino, si desea utilizar la sintaxis de consulta. A mitad de camino en el sentido de que necesita usar el método Select en ambas listas para obtener los índices que usará en la cláusula 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}; 

La ventaja de esta solución es que no lo puedo fallar si las listas tienen diferentes longitudes, como la solución utilizando el indexador haría.

5

Si está utilizando .Net 4.0, puede usar el método de extensión Zip y 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)); 

Como alternativa, puede mantenerlos como matrices:

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