Joindre deux listes ensemble

Si j’ai deux listes de type chaîne (ou tout autre type), comment joindre rapidement les deux listes?

La commande doit restr la même. Les doublons doivent être supprimés (bien que chaque élément des deux liens soit unique). Je n’ai pas trouvé grand chose à ce sujet lorsque je cherchais sur Google et je ne voulais pas implémenter d’interfaces .NET pour la rapidité de livraison.

Tu pourrais essayer:

List a = new List(); List b = new List(); a.AddRange(b); 

Page MSDN pour AddRange

Cela préserve l’ordre des listes, mais ne supprime pas les doublons que Union ferait.

Cela change la liste a . Si vous souhaitez conserver les listes originales, vous devez utiliser Concat (comme indiqué dans les autres réponses):

 var newList = a.Concat(b); 

Cela retourne un IEnumerable tant que a n’est pas null.

Le moyen le moins encombrant consiste à utiliser la méthode d’extension Concat.

 var combined = list1.Concat(list2); 

Il crée une instance de IEnumerable qui énumère les éléments de list1 et list2 dans cet ordre.

La méthode Union pourrait répondre à vos besoins. Vous n’avez pas précisé si l’ordre ou les doublons étaient importants.

Prenez deux IEnumerables et effectuez une union comme vu ici:

 int[] ints1 = { 5, 3, 9, 7, 5, 9, 3, 7 }; int[] ints2 = { 8, 3, 6, 4, 4, 9, 1, 0 }; IEnumerable union = ints1.Union(ints2); // yields { 5, 3, 9, 7, 8, 6, 4, 1, 0 } 

Quelque chose comme ça:

 firstList.AddRange (secondList); 

Vous pouvez également utiliser la méthode d’extension ‘Union’ définie dans System.Linq. Avec ‘Union’, vous pouvez également spécifier un comparateur, qui peut être utilisé pour spécifier si un élément doit être associé ou non.

Comme ça:

 List one = new List { 1, 2, 3, 4, 5 }; List second=new List { 1, 2, 5, 6 }; var result = one.Union (second, new EqComparer ()); foreach( int x in result ) { Console.WriteLine (x); } Console.ReadLine (); #region IEqualityComparer Members public class EqComparer : IEqualityComparer { public bool Equals( int x, int y ) { return x == y; } public int GetHashCode( int obj ) { return obj.GetHashCode (); } } #endregion 
 targetList = list1.Concat(list2).ToList(); 

Ca marche bien je le pense. Comme indiqué précédemment, Concat renvoie une nouvelle séquence et lors de la conversion du résultat en liste, il fait parfaitement le travail. Les conversions implicites peuvent parfois échouer lors de l’utilisation de la méthode AddRange.

Si certains éléments existent dans les deux listes, vous pouvez utiliser

 var all = list1.Concat(list2).Concat(list3) ... Concat(listN).Distinct().ToList(); 

Tant qu’ils sont du même type, c’est très simple avec AddRange:

 list2.AddRange(list1); 

La méthode AddRange

 aList.AddRange( anotherList ); 
 var bigList = new List { 1, 2, 3 } .Concat(new List { 4, 5, 6 }) .ToList(); /// yields { 1, 2, 3, 4, 5, 6 } 
 List list1 = new List(); list1.Add("dot"); list1.Add("net"); List list2 = new List(); list2.Add("pearls"); list2.Add("!"); var result = list1.Concat(list2); 

un moyen: List.AddRange () selon les types?

Voir ce lien

 public class ProductA { public ssortingng Name { get; set; } public int Code { get; set; } } public class ProductComparer : IEqualityComparer { public bool Equals(ProductA x, ProductA y) { //Check whether the objects are the same object. if (Object.ReferenceEquals(x, y)) return true; //Check whether the products' properties are equal. return x != null && y != null && x.Code.Equals(y.Code) && x.Name.Equals(y.Name); } public int GetHashCode(ProductA obj) { //Get hash code for the Name field if it is not null. int hashProductName = obj.Name == null ? 0 : obj.Name.GetHashCode(); //Get hash code for the Code field. int hashProductCode = obj.Code.GetHashCode(); //Calculate the hash code for the product. return hashProductName ^ hashProductCode; } } ProductA[] store1 = { new ProductA { Name = "apple", Code = 9 }, new ProductA { Name = "orange", Code = 4 } }; ProductA[] store2 = { new ProductA { Name = "apple", Code = 9 }, new ProductA { Name = "lemon", Code = 12 } }; 

// Récupère les produits des deux tableaux // sauf les doublons.

 IEnumerable union = store1.Union(store2); foreach (var product in union) Console.WriteLine(product.Name + " " + product.Code); /* This code produces the following output: apple 9 orange 4 lemon 12 */ 

Je voulais juste tester comment Union fonctionne avec le comparateur par défaut sur les collections qui se chevauchent des objects de type référence.

Mon object est:

 class MyInt { public int val; public override ssortingng ToSsortingng() { return val.ToSsortingng(); } } 

Mon code de test est:

 MyInt[] myInts1 = new MyInt[10]; MyInt[] myInts2 = new MyInt[10]; int overlapFrom = 4; Console.WriteLine("overlapFrom: {0}", overlapFrom); Action, ssortingng> printMyInts = (myInts, myIntsName) => Console.WriteLine("{2} ({0}): {1}", myInts.Count(), ssortingng.Join(" ", myInts), myIntsName); for (int i = 0; i < myInts1.Length; i++) myInts1[i] = new MyInt { val = i }; printMyInts(myInts1, nameof(myInts1)); int j = 0; for (; j + overlapFrom < myInts1.Length; j++) myInts2[j] = myInts1[j + overlapFrom]; for (; j < myInts2.Length; j++) myInts2[j] = new MyInt { val = j + overlapFrom }; printMyInts(myInts2, nameof(myInts2)); IEnumerable myUnion = myInts1.Union(myInts2); printMyInts(myUnion, nameof(myUnion)); for (int i = 0; i < myInts2.Length; i++) myInts2[i].val += 10; printMyInts(myInts2, nameof(myInts2)); printMyInts(myUnion, nameof(myUnion)); for (int i = 0; i < myInts1.Length; i++) myInts1[i].val = i; printMyInts(myInts1, nameof(myInts1)); printMyInts(myUnion, nameof(myUnion)); 

La sortie est la suivante:

 overlapFrom: 4 myInts1 (10): 0 1 2 3 4 5 6 7 8 9 myInts2 (10): 4 5 6 7 8 9 10 11 12 13 myUnion (14): 0 1 2 3 4 5 6 7 8 9 10 11 12 13 myInts2 (10): 14 15 16 17 18 19 20 21 22 23 myUnion (14): 0 1 2 3 14 15 16 17 18 19 20 21 22 23 myInts1 (10): 0 1 2 3 4 5 6 7 8 9 myUnion (14): 0 1 2 3 4 5 6 7 8 9 20 21 22 23 

Donc, tout fonctionne bien.

Les deux options que j’utilise sont:

 list1.AddRange(list2); 

ou

 list1.Concat(list2); 

Cependant, j’ai remarqué que lorsque AddRange méthode AddRange avec une fonction récursive, qui s’appelle très souvent, j’ai une exception SystemOutOfMemoryException car le nombre maximal de dimensions a été atteint.

(Message Google traduit)
Les dimensions du tableau ont dépassé la plage prise en charge.

Utiliser Concat résolu ce problème.

D’une manière, je n’ai pas vu mentionné qui peut être un peu plus robuste, particulièrement si vous vouliez modifier chaque élément d’une certaine manière (par exemple, vous vouliez .Trim() tous les éléments.

 List a = new List(); List b = new List(); // ... b.ForEach(x=>a.Add(x.Trim()));