Ich habe eine Klasse geschrieben, die von IEqualityComparer<T>
abgeleitet ist, die für die LINQ-Abfrage funktioniert, für die ich sie brauchte.Verwenden des GetHashCode() - Teils von IEqualityComparer <T> für direkte Vergleiche?
Wie ich es verstehe, GetHashCode()
(schnell) wird zuerst genannt, dann Equals()
(etwas langsamer), wenn der Hashcode der gleiche ist, für solche Operationen.
jedoch, wenn es für einen direkten Vergleich mit manuell, ich bin mit so etwas wie
return new MyIEqualityComparer().Equals(objA,objB);
, die die schnellere GetHashCode()
Gleichheitsprüfung verzichtet. Gibt es eine Möglichkeit, objA
mit objB
zu vergleichen, die nicht automatisch die schnellere Prüfung GetHashCode()
überspringen?
Ich glaube, ich hatte gehofft objA.Equals()
würde eine Überladung haben, die ein Argument von IEqualityComparer<T>
abgeleitet akzeptiert.
Haben Sie ein Leistungsproblem, das Sie zu lösen versuchen, oder ist das nur "Optimierung"? – stuartd
GetHashCode stellt keine Gleichheit her, es lässt Sie herausfinden, zu welchem Bucket ein Element in einer Hash-Tabelle gehört (Dictionary oder HashSet), so dass es eine tatsächliche Gleichheitsprüfung für viel weniger Elemente als die gesamte Sammlung durchführen kann. –
Sein Hauptzweck ist es, Objekte in eine Hash-Tabelle zu setzen, ich glaube nicht, dass Sie irgendwelche Garantien dafür nehmen können, ob es schneller ist oder nicht. –