2009-04-23 5 views
5

Comment puis-je joindre 2 listes de longueurs égales (pour produire une 3ème liste de longueur égale) où je ne veux pas spécifier une condition mais simplement compter sur l'ordre des éléments dans les 2 listes.Joindre 2 listes par ordre au lieu de condition dans LINQ

Par exemple, comment puis-je rejoindre:

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

pour produire:

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

J'ai essayé ce qui suit:

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

mais produit une jointure croisée. Quand j'utilise join, j'ai toujours besoin de spécifier le "on".

Répondre

15

Vous pouvez utiliser Select dans la première liste, utilisez l'index de l'élément et accéder à l'élément sur la deuxième liste:

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

Excellente réponse. +1 –

+0

très gentil !!! :) – Ryan

0

Il y a une solution à mi-chemin, si vous voulez utiliser la syntaxe de requête. À mi-chemin dans le sens où vous devez utiliser la méthode Select sur les deux listes afin d'obtenir les index que vous utiliserez dans la clause 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}; 

L'avantage de cette solution est qu'elle ne pas coutume si les listes ont des longueurs différentes, comme la solution en utilisant l'indexeur ferait.

5

Si vous utilisez .Net 4.0, vous pouvez utiliser la méthode d'extension Zip et les 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)); 

Alternativement, vous pouvez les garder sous forme de tableaux:

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