Quel est le plus rapide (et le moins gourmand en ressources) pour comparer deux énormes (> 50 000 articles) et, par conséquent, avoir deux listes comme celles ci-dessous:
- les éléments qui apparaissent dans la première liste mais pas dans la seconde
- les éléments qui apparaissent dans la deuxième liste mais pas dans la première
Actuellement, je travaille avec List 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 souhaiterais. Une idée de rendre cela plus rapide et moins gourmand en ressources car j'ai besoin de traiter un grand nombre de listes?
Equals(object)
et / ou implémente,IEquatable<T>
cela devrait aller.IEquatable<T>
implémentation ou laobject.Equals(object)
méthode. Il semble que vous devriez créer une nouvelle question avec un exemple reproductible minimal - nous ne pouvons pas vraiment diagnostiquer les choses dans les commentaires.Plus efficace serait d'utiliser
Enumerable.Except
:Cette méthode est implémentée en utilisant une exécution différée. Cela signifie que vous pourriez écrire par exemple:
Il est également efficace car il utilise en interne un
Set<T>
pour comparer les objets. Il fonctionne en collectant d'abord toutes les valeurs distinctes de la deuxième séquence, puis en diffusant les résultats de la première, en vérifiant qu'ils n'ont jamais été vus auparavant.la source
Set<T>
est construit à partir de la deuxième séquence (c'est-à-dire qu'il est entièrement itéré et stocké), puis les éléments qui peuvent être ajoutés à partir de la première séquence sont générés.Where
est partiellement différée car danslist.Where(x => x.Id == 5)
la valeur du nombre5
est stockée au début, plutôt qu'exécutée paresseusement.Cela fonctionne pour tous les types de données primitifs. Si vous devez l'utiliser sur des objets personnalisés, vous devez l'implémenter
IEqualityComparer
Définit des méthodes pour prendre en charge la comparaison d'objets pour l'égalité.
la source
SequenceEqual
est simplebool
. L'OP veut deux listes de résultats - et décrit ce qu'ils veulent en termes d'opérations d'ensemble: "les éléments qui apparaissent dans la première liste mais pas dans la seconde". Il n'y a aucune indication que la commande est pertinente, alors que SequenceEqual ne juge pas pertinent. Cela semble répondre à une question entièrement différente.Si vous souhaitez que les résultats ne respectent pas la casse , les éléments suivants fonctionneront:
firstNotSecond
contiendrait b1.dllsecondNotFirst
contiendrait b2.dllla source
Pas pour ce problème, mais voici du code pour comparer les listes pour égal et non! objets identiques:
la source
Except
essayez de cette façon:
la source
Parfois, il suffit de savoir si deux listes sont différentes et non pas quelles sont ces différences. Dans ce cas, envisagez d'ajouter cette méthode d'extension à votre projet. Notez que vos objets listés doivent implémenter IEquatable!
Usage:
Quelle que soit la
Component
classe, les méthodes présentées iciCar
doivent être implémentées de manière presque identique.Il est très important de noter comment nous avons écrit GetHashCode. Afin d'implémenter correctement
IEquatable
,Equals
etGetHashCode
doit fonctionner sur les propriétés de l'instance d'une manière logiquement compatible.Deux listes avec le même contenu sont toujours des objets différents et produiront des codes de hachage différents. Puisque nous voulons que ces deux listes soient traitées comme égales, nous devons laisser
GetHashCode
produire la même valeur pour chacune d'elles. Nous pouvons accomplir cela en déléguant le code de hachage à chaque élément de la liste et en utilisant le XOR au niveau du bit standard pour les combiner tous. XOR est indépendant de l'ordre, donc peu importe si les listes sont triées différemment. Il importe seulement qu'ils ne contiennent que des membres équivalents.Remarque: le nom étrange signifie que la méthode ne prend pas en compte l'ordre des éléments dans la liste. Si vous vous souciez de l'ordre des éléments dans la liste, cette méthode n'est pas pour vous!
la source
J'ai utilisé ce code pour comparer deux listes contenant des millions d'enregistrements.
Cette méthode ne prendra pas beaucoup de temps
la source
Si seul un résultat combiné est nécessaire, cela fonctionnera aussi:
où T est le type d'élément de listes.
la source
C'est peut-être drôle, mais ça marche pour moi
string.Join ("", List1)! = string.Join ("", List2)
la source
Je pense que c'est un moyen simple et facile de comparer deux listes élément par élément
la source
C'est la meilleure solution que vous ayez trouvée
la source
List<T>
pour chaque élément danslist1
. Le résultat est également appelélist3
quand ce n'est pas unList<T>
.