Einfache IEqualityComparerT Frage

8

Ich versuche, doppelte Einträge aus einer Liste zu entfernen, die ein generisches Objekt enthält.

%Vor%

Und der Code, um die Duplikate zu entfernen:

%Vor%

Das Problem ist Equals und GetHashCode wird nie aufgerufen. Jeder hat eine Idee warum?

    
duckwizzle 12.05.2011, 16:21
quelle

4 Antworten

12

Weil Distinct faul ist. Versuche am Ende ToList() hinzuzufügen.

Längere Antwort. Linq-Operationen sind eigentlich deklarative. Sie definieren die Abfrage, aber sie sagen nicht, sie auszuführen. IEnumerable<T> enthält keine Daten, nur Abfragedefinition. Sie haben Abfrage erstellt, okay, wie Sie Daten erhalten?

  • foreach die IEnumerable . Da foreach zwingend erforderlich ist, müssen alle Daten abgerufen werden (Abfrage ausgeführt).
  • Rufen Sie ToList / ToDictionary auf. Diese Sammlungen speichern reale Daten, so dass das System eine Abfrage ausführen muss, um sie zu füllen.
Andrey 12.05.2011, 16:25
quelle
2

LINQ wird langsam ausgewertet, so dass es nicht ausgeführt wird, bis Sie GetEnumerator und möglicherweise sogar MoveNext aufrufen.

Fügen Sie am Ende dieser Abfrage ein .ToList() hinzu und es sollte sofort ausgeführt werden.

    
Cory Nelson 12.05.2011 16:26
quelle
2

Der IEqualityComparer wird erst aufgerufen, wenn IEnumerable aufgelistet wird.

Versuchen Sie

%Vor%     
foson 12.05.2011 16:30
quelle
1

Ich würde

machen %Vor%

um die neue Liste sofort zu rendern. Es sei denn, Sie benötigen wirklich einen Enumerator, um den Speicher zu schonen.

    
Daniel Mošmondor 23.05.2012 20:12
quelle

Tags und Links