Comment créer une seule liste de paires d’objects à partir de deux listes en C #?

J’ai deux listes d’objects. Liste A et liste B. Je dois créer la liste C qui combine la liste A et la liste B par paires. Par exemple:

List A object a1 object a2 object a3 List B object b1 object b2 object b3 List C (creates pairs) object c1 (object a1, object b1) object c2 (object a2, object b2) object c3 (object a3, object b3) 

Cela le ferait:

 public static IEnumerable> CombineWith(this IEnumerable first, IEnumerable second) { using (var firstEnumerator = first.GetEnumerator()) using (var secondEnumerator = second.GetEnumerator()) { bool hasFirst = true; bool hasSecond = true; while ( // Only call MoveNext if it didn't fail last time. (hasFirst && (hasFirst = firstEnumerator.MoveNext())) | // WARNING: Do NOT change to ||. (hasSecond && (hasSecond = secondEnumerator.MoveNext())) ) { yield return Tuple.Create( hasFirst ? firstEnumerator.Current : default(T), hasSecond ? secondEnumerator.Current : default(U) ); } } } 

Edit: Je préfère grandement la réponse de Paul .

Vous pouvez utiliser la méthode Enumerable.Zip () dans System.Linq.

 IEnumerable> pairs = listA.Zip(listB, (a, b) => Tuple.Create(a, b)); 

Exemple utilisant l’énumérable résultant:

 foreach (Tuple pair in pairs) { A a = pair.Item1; B b = pair.Item2; } 

Dommage qu’il n’y ait pas de surcharge qui automatise la tupleation dans .NET. Une telle extension ressemblerait à ceci:

 public static IEnumerable> Zip(this IEnumerable first, IEnumerable second) { return first.Zip(second, Tuple.Create); } 

Ce qui voudrait dire que vous pourriez alors écrire un code qui ressemble à:

 IEnumerable> pairs = listA.Zip(listB); 

Remarque: Une autre option serait de créer des types anonymes à la place de Tuple mais l’inconvénient de cette approche est que vous ne pourriez pas (utilement) passer l’Ienumerable résultant de la méthode dans laquelle il est créé, car le type ne porte pas de nom. .

Quelque chose comme ça:

  var listA = new object[] { "1", "2", "3" }; var listB = new object[] { "a", "b", "c" }; var listC = Enumerable.Zip(listA,listB, (x,y)=>new {x,y}); foreach (var item in listC) { Console.WriteLine("{0},{1}", item.x,item.y); } 

Sortie: 1, a 2, b 3, c

Je suggérerais d’utiliser une liste de tupples

http://msdn.microsoft.com/en-us/library/system.tuple.aspx .

Quand vous dites “paires”, voulez-vous dire paires clé / valeur?

Si oui, vous voulez utiliser Dictionary