2009-04-23 9 views
5

Wie kann ich 2 Listen gleicher Länge (um eine dritte Liste von gleicher Länge zu erstellen) beitreten, wo ich keine Bedingung angeben möchte, sondern einfach auf die Reihenfolge der Elemente in die 2 Listen.Verknüpfen Sie 2 Listen nach Auftrag anstelle von Bedingung in LINQ

zB wie kann ich beitreten:

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

zu produzieren:

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

Ich habe versucht, die folgenden:

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

aber dies erzeugt ein Kreuz zu verbinden. Wenn ich join verwende, muss ich immer "on" angeben.

Antwort

15

Sie Select in der ersten Liste verwenden könnte, das Element Index verwenden, und das Element auf der zweiten Liste zuzugreifen:

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

Ausgezeichnete Antwort. +1 –

+0

sehr schön !!! :) – Ryan

0

Es gibt eine auf halbem Weg Lösung, wenn Sie Abfragesyntax verwenden möchten. Halbwegs in dem Sinne, dass Sie die Select-Methode in beiden Listen verwenden müssen, um die Indizes zu erhalten, die Sie in der where-Klausel verwenden.

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}; 

Der Vorteil dieser Lösung ist, dass es wird nicht fehlschlagen, wenn die Listen unterschiedliche Längen aufweisen, als die Lösung tun würde, den Indexer verwenden.

5

Wenn Sie .Net 4.0 verwenden, können Sie die Zip-Erweiterungsmethode und Tupel verwenden.

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)); 

Alternativ können Sie sie als Arrays halten:

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