316 votes

Le moyen le plus rapide de comparer deux List<>

Quelle est la méthode la plus rapide (et la moins gourmande en ressources) pour comparer deux listes massives (>50.000 articles) et obtenir ainsi deux listes comme celles ci-dessous :

  1. les éléments qui apparaissent dans la première liste mais pas dans la seconde.
  2. les éléments qui apparaissent dans la deuxième liste mais pas dans la première.

Actuellement, je travaille avec la liste ou IReadOnlyCollection et je résous ce problème dans une requête linq :

var list1 = list.Where(i => !list2.Contains(i)).ToList();
var list2 = list2.Where(i => !list.Contains(i)).ToList();

Mais cela ne fonctionne pas aussi bien que je le voudrais. Avez-vous une idée pour rendre cette opération plus rapide et moins gourmande en ressources, car je dois traiter un grand nombre de listes ?

1 votes

Si vous rencontrez cette question et que vous envisagez d'ajouter une nouvelle réponse, veuillez noter qu'ils ne demandent pas de a mais le le plus rapide manière.

-2voto

Jibz Points 59

C'est peut-être drôle, mais ça marche pour moi :

string.Join("",List1) != string.Join("", List2)

1 votes

Tel qu'il est écrit ici, il ne fonctionnerait même pas pour List<string> ou List<int>, car par exemple les deux listes 11;2;3 et 1;12;3 seraient identiques puisque vous ne joignez pas les chaînes avec un séparateur unique qui n'est pas un élément possible dans la liste. En dehors de cela, la concaténation de chaînes de caractères pour une liste comportant de nombreux éléments est probablement un problème de performances.

0 votes

@SwissCoder : Vous avez tort, ce n'est pas un tueur de performance pour les chaînes. Si vous avez deux listes avec 50.000 chaînes (chacune de longueur 3) cet algorithme a besoin de 3 ms sur ma machine. La réponse acceptée en demande 7. Je pense que l'astuce est que Jibz n'a besoin que d'une seule comparaison de chaîne. Bien sûr, il doit ajouter un séparateur unique.

1 votes

@user1027167 : Je ne parle pas de comparer directement des chaînes de caractères (car ce n'est pas non plus la question). L'appel de la méthode .ToString() de tous les objets d'une liste de 50 000 objets peut créer une énorme chaîne de caractères, selon la façon dont elle est mise en œuvre. Je ne pense pas que ce soit la voie à suivre. Il est également risqué de compter sur le caractère "unique" d'un caractère ou d'une chaîne de caractères, le code ne serait pas vraiment réutilisable de cette manière.

-2voto

user10915707 Points 11

Je pense que c'est un moyen simple et facile de comparer deux listes élément par élément

x=[1,2,3,5,4,8,7,11,12,45,96,25]
y=[2,4,5,6,8,7,88,9,6,55,44,23]

tmp = []

for i in range(len(x)) and range(len(y)):
    if x[i]>y[i]:
        tmp.append(1)
    else:
        tmp.append(0)
print(tmp)

4 votes

Il s'agit d'une question C#, et vous n'avez pas fourni de code C#.

3 votes

Peut-être pourriez-vous supprimer cette réponse et la déplacer vers (par exemple) Comment comparer deux listes en python et renvoyer les correspondances ? ?

-3voto

Fajoui El Mahdi Points 15

C'est la meilleure solution que vous trouverez

var list3 = list1.Where(l => list2.ToList().Contains(l));

3 votes

C'est en fait très mauvais car cela crée une nouvelle List<T> pour chaque élément dans list1 . Le résultat est également appelé list3 quand il ne s'agit pas d'un List<T> .

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