2008-11-14 7 views
18

Dire que j'ai deux listes:Pouvez-vous combiner plusieurs listes avec LINQ?

var list1 = new int[] {1, 2, 3}; 
var list2 = new string[] {"a", "b", "c"}; 

Est-il possible d'écrire une déclaration LINQ qui va générer la liste suivante:

var result = new []{ 
    new {i = 1, s = "a"}, 
    new {i = 1, s = "b"}, 
    new {i = 1, s = "c"}, 
    new {i = 2, s = "a"}, 
    new {i = 2, s = "b"}, 
    new {i = 2, s = "c"}, 
    new {i = 3, s = "a"}, 
    new {i = 3, s = "b"}, 
    new {i = 3, s = "c"} 
}; 

? Edit: J'ai oublié de mentionner que je ne le voulais pas dans la syntaxe de requête. Quoi qu'il en soit, en fonction de la réponse de preetsangha j'ai les suivantes:

var result = list1.SelectMany(i => list2.Select(s => new {i = i, s = s})); 
+0

Qu'est-ce qui ne va pas avec la syntaxe de la requête? –

+0

Oui, bizarre que vous choisissiez la réponse de Jon comme réponse quand preetsangha est entré en premier et avait une autre version du même code (avec le respect dû à Jon). –

+2

Si je pouvais choisir les deux je le ferais. Quant à ne pas aimer la syntaxe de la requête, je ne l'aime pas. Il se sent mal car il ne rentre pas dans C# et tous les nouveaux éléments de LINQ ne sont pas disponibles dans la syntaxe de requête, comme ToList() etc. –

Répondre

21

La réponse de preetsangha est tout à fait correct, mais si vous ne voulez pas une expression de requête alors il est:

var result = list1.SelectMany(l1 => list2, (l1, l2) => new { i = l1, s = l2}); 

(C'est ce que le compilateur compile l'expression de la requête - ils sont identiques.)

42
var result = from l1 in list1 
      from l2 in list2  
      select new { i = l1, s = l2}; 
Questions connexes