System.Drawing.Point
hat eine wirklich, wirklich schlecht GetHashCode
Methode, wenn Sie beabsichtigen, es zu verwenden, um beschreibt ‚Pixel‘ in einem Bild/Bitmap: it is just XOR between the X and Y coordinates.Stellvertreter die GetHashCode() Methode der System.Drawing.Point
Also für ein Bild mit sagen wir mal 2000x2000 Größe, hat es eine absurde Anzahl von Kolonien, da nur die Zahlen in der Diagonale einen anständigen Hashwert haben werden.
Es ist ziemlich einfach, eine anständige GetHashCode
Methode mit ungeprüfter Multiplikation zu erstellen, wie einige Leute bereits erwähnt here.
Aber was kann ich tun, um diese verbesserte GetHashCode
Methode in einem HashSet
zu verwenden? Ich weiß, ich könnte meine eigene Klasse/Struktur MyPoint
erstellen und implementieren Sie mit dieser verbesserten Methoden, aber dann würde ich alle anderen Teile des Codes in meinem Projekt, die eine System.Drawing.Point
verwenden.
Ist es möglich, die Methode von System.Drawing.Point
mit einer Art von Extension-Methode oder dergleichen zu "überschreiben"? Oder die HashSet
"zu sagen", eine andere Funktion anstelle der GetHashCode
zu verwenden?
Momentan verwende ich eine SortedSet<System.Drawing.Point>
mit einer benutzerdefinierten IComparer<Point>
, um meine Punkte zu speichern. Wenn ich wissen will, ob das Set einen Punkt enthält, rufe ich BinarySearch
an. Es ist schneller als eine HashSet<System.Drawing.Point>.Contains
Methode in einem Set mit 10000 Kolonien, aber es ist nicht so schnell wie HashSet
mit einem guten Hash könnte sein.
Das ist genial! Ich habe nicht bemerkt, dass ein IEqualityComparer eine GetHashCode() -Methode hatte! Perfekte Antwort! – Trauer