386 votes

Joindre deux listes ensemble

Si j'ai deux listes de type chaîne de caractères (ou tout autre type), quel est le moyen rapide de joindre les deux listes ?

EDIT : L'ordre devrait rester le 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 sur ce sujet en cherchant sur Google et je n'ai pas voulu implémenter d'interfaces .NET pour accélérer la livraison.

Merci

5 votes

L'ordre a-t-il une importance ? Voulez-vous conserver les doublons ?

2 votes

Duplicata possible de Comment concaténer des listes en C# ? .

660voto

ChrisF Points 74295

Vous pouvez essayer :

List<string> a = new List<string>();
List<string> b = new List<string>();

a.AddRange(b);

L'ordre des listes est ainsi préservé, mais les doublons ne sont pas supprimés. Union ferait.

35 votes

Personne n'a vraiment cherché à savoir quand utiliser telle ou telle méthode. AddRange modifie une liste en place, en y ajoutant la deuxième liste (comme si vous appeliez .Add(foo) un grand nombre de fois). Les méthodes d'extension Concat et Union ne modifient pas la liste d'origine. Elles construisent paresseusement un nouveau IEnumerable et n'accèdent même pas aux membres de la liste originale, sauf si cela est nécessaire. Comme indiqué, Union supprime les doublons alors que les autres ne le font pas.

4 votes

Quelqu'un sait-il quelle est la complexité de cette méthode ? (C'est vraiment dommage que Microsoft ne fournisse pas cette information importante dans le cadre de son MSDN).

2 votes

Je vous recommande de consulter cette bonne comparaison des différentes approches. Elle présente également une analyse des performances des différentes options : Fusionner les collections

123voto

JaredPar Points 333733

Le moyen le moins encombrant est d'utiliser la méthode d'extension Concat.

var combined = list1.Concat(list2);

Il crée une instance de IEnumerable<T> qui va énumérer les éléments de list1 et list2 dans cet ordre.

3 votes

N'oubliez pas de using System.Linq; pour pouvoir utiliser Concat

45voto

Larsenal Points 17080

Le site 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 ici :

int[] ints1 = { 5, 3, 9, 7, 5, 9, 3, 7 };
int[] ints2 = { 8, 3, 6, 4, 4, 9, 1, 0 };

IEnumerable<int> union = ints1.Union(ints2);

// yields { 5, 3, 9, 7, 8, 6, 4, 1, 0 }

27voto

Frederik Gheysels Points 36354

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 uni ou non.

Comme ça :

List<int> one = new List<int> { 1, 2, 3, 4, 5 };
List<int> second=new List<int> { 1, 2, 5, 6 };

var result = one.Union (second, new EqComparer ());

foreach( int x in result )
{
    Console.WriteLine (x);
}
Console.ReadLine ();

#region IEqualityComparer<int> Members
public class EqComparer : IEqualityComparer<int>
{
    public bool Equals( int x, int y )
    {
        return x == y;
    }

    public int GetHashCode( int obj )
    {
        return obj.GetHashCode ();
    }
}
#endregion

1 votes

+1 pour l'utilisation d'un EqualityComparer ! J'ai pu l'utiliser pour une meilleure gestion de mes listes d'objets personnalisés.

19voto

Balasubramani M Points 538
targetList = list1.Concat(list2).ToList();

Il fonctionne bien, je 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 son travail. Les conversions implicites peuvent parfois échouer lors de l'utilisation de la méthode AddRange.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X