Le moyen le plus rapide pour comparer deux Liste<>
Ce qui est le plus rapide (et moins gourmande en ressources) pour comparer les deux massifs (>50.000 points) et, en conséquence, avoir deux listes comme celles ci-dessous:
- les éléments qui apparaissent dans la première liste, mais pas dans le deuxième
- 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 de résoudre 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 ce n'est pas aussi bon que je le voudrais.
Toute idée de faire de ce plus rapide et moins gourmande en ressources que j'ai besoin de traiter un beaucoup de listes?
InformationsquelleAutor Frank | 2012-10-09
Vous devez vous connecter pour publier un commentaire.
Utilisation
Sauf
:Je soupçonne qu'il y a des approches qui serait en réalité légèrement plus rapide que ça, mais même ce sera très plus vite que votre O(N * M) approche.
Si vous voulez combiner ces, vous pouvez créer une méthode avec le ci-dessus, puis une instruction de retour:
Equals(object)
et/ou met en œuvreIEquatable<T>
il doit être fine.IEquatable<T>
, pas sûr à ce sujet.IQueryable<T>
, qui pourrait être très différente, car il dépend de ce que SQL est généré par l'EF fournisseur.Except
œuvres.IEquatable<T>
mise en œuvre ou laobject.Equals(object)
méthode. Il semble que vous devez créer une nouvelle question avec un un minimum de reproductibles exemple - nous ne pouvons pas vraiment diagnostiquer les choses dans les commentaires.Equals
méthode. Il semble que vous n'avez ni remplacéeEquals
ni mis en œuvreIEquatable<T>
, auquel cas le résultat est comme prévu. Que, fondamentalement, ce que j'ai dit à 17:19:29Z. Ou vous pourriez passer dans unIEqualityComparer<T>
de cours.Plus efficace serait d'utiliser
Énumérable.À l'exception de
:Cette méthode est implémentée à l'aide de l'exécution différée. Cela signifie que vous pouvez écrire par exemple:
Il est également efficace puisqu'il utilise en interne une
Set<T>
pour comparer les objets. Il fonctionne d'abord la collecte de toutes les valeurs distinctes à partir de la deuxième séquence, puis le streaming les résultats de la première, en vérifiant qu'ils n'ont pas été vu avant.Set<T>
est construit à partir de la deuxième séquence (c'est à dire qu'il est entièrement creusée et stockées), puis les éléments qui peuvent être ajoutés à partir de la première séquence sont donné.Where
est partiellement reporté, parce que, danslist.Where(x => x.Id == 5)
la valeur du nombre5
est stocké au début, plutôt que exécutée paresseusement.Si vous voulez que les résultats soient casse, le travail:
firstNotSecond
contiendrait b1.dllsecondNotFirst
contiendrait b2.dllPas pour ce Problème, mais voici un peu de code pour comparer les listes de l'égalité et de la non! objets identiques:
Except
essayer de cette façon:
J'ai utilisé ce code pour comparer deux liste qui a des millions d'enregistrements.
Cette méthode ne prendra pas beaucoup de temps
Parfois, vous avez seulement besoin de savoir si deux listes sont différentes, et pas en quoi consistent ces différences. Dans ce cas, envisager l'ajout de cette méthode d'extension pour votre projet. Notez que vos objets répertoriés devrait mettre en œuvre IEquatable!
Utilisation:
Quel que soit le
Component
classe, les méthodes indiquées ici pourCar
devrait être mis en œuvre de manière quasiment identique.Il est très important de noter la façon dont nous l'avons écrit GetHashCode. Afin de mettre en œuvre correctement
IEquatable
,Equals
etGetHashCode
doit fonctionner sur l'instance de propriétés dans une logique de compatibilité.Deux listes avec le même contenu sont toujours différents objets, et de produire différents codes de hachage. Puisque nous voulons que ces deux listes à être traités comme des égaux, nous devons laisser les
GetHashCode
produire la même valeur pour chacun d'eux. Nous pouvons réaliser cela en déléguant le hashcode de chaque élément dans la liste, et à l'aide de la norme XOR au niveau du bit pour les combiner. XOR est de l'ordre indépendant, de sorte qu'il n'a pas d'importance si les listes sont triées de manière différente. Il importe seulement qu'ils ne contiennent que de l'équivalent de membres.Remarque: le nom étrange est d'impliquer le fait que la méthode ne considère pas l'ordre des éléments dans la liste. Si vous ne vous souciez de l'ordre des éléments dans la liste, cette méthode n'est pas pour vous!
Cela fonctionne pour tous les types de données primitifs. Si vous avez besoin de l'utiliser sur des objets personnalisés vous avez besoin pour mettre en œuvre
IEqualityComparer
Définit les méthodes pour soutenir la comparaison des objets pour l'égalité.
Si seulement résultat combiné de besoin, ce sera trop de travail:
où T est le type de listes d'élément.
Peut-être son drôle, mais fonctionne pour moi
chaîne.Join("",List1) != chaîne de caractères.Join("", Liste2)
C'est la meilleure solution que vous aurez trouvé
List<T>
pour chaque élément danslist1
. Aussi le résultat est appelélist3
quand ce n'est pas unList<T>
.Je pense que c'est une façon simple et facile de comparer les deux listes de l'élément par élément