2009-06-08 7 views
1

Ich verwende eine HashSet<T>, um eine Sammlung von Objekten zu speichern. Diese Objekte haben bereits eine eindeutige ID von System.Guid, also würde ich lieber die HashSet<> einfach diese vorhandene ID verwenden, anstatt zu versuchen, selbst herauszufinden, wie man das Objekt hasht. Wie überschreibe ich das Build in Hashing und zwinge mein Programm, den Build-ID-Wert als Hash-Wert zu verwenden?Wie steuere ich, wie ein Objekt von einem Hash-Set gehackt wird

auch sagen, ich kenne die Guid ein Objekt in meinem HashSet<>, ist es eine Möglichkeit, ein Objekt aus einem HashSet<T> basierte bekommen auf diesen Guid allein? Oder sollte ich stattdessen ein Wörterbuch verwenden?

Antwort

4

Ein HashSet<> basiert nicht auf einem Schlüssel/Wert-Paar und bietet keinen "per Schlüssel" -Zugang - es ist nur eine Menge eindeutiger Werte, die den Hash verwenden, um die Eindämmung sehr schnell zu überprüfen.

Um ein Schlüssel/Wert-Paar zu verwenden (um später durch Guid zu holen), wäre die einfachste Option eine Dictionary<Guid,SomeType>. Der bestehende Hash-Code auf Guid sollte in Ordnung sein (obwohl wenn Sie benötigt (Sie nicht hier) Sie IEqualityComparer<T> für Hashing verwendet werden bieten können.

1

Warum müssen Sie dies überschreiben? scheint vielleicht eine vorzeitige Optimierung zu sein.

Ja, verwenden Sie einfach ein Wörterbuch. Sobald Sie Ihre Anwendung entwickelt haben, durchlaufen Sie eine Phase der Leistungsoptimierung, in der Sie die Leistung Ihres gesamten Codes messen. Wenn und nur wenn diese Hash-Funktion zeigt als größten Drain ist, sollten Sie eine leistungsfähigere Datenstruktur prüfen (falls es einen gibt sowieso) :-)

1

Versuchen in System.KeyedCollection suchen. Es ermöglicht Ihnen, das Wissen des Schlüsselfeldes in Ihre Sammlungsimplementierung einzubetten.

+0

hier vorsichtig sein, da die KeyedCollection intern ein Wörterbuch verwendet :-P Aus der Dokumentation "Standardmäßig enthält die KeyedCollection eine Suche Wörterbuch. Wenn ein Element der KeyedCollection hinzugefügt wird, wird der Schlüssel des Elements einmal extrahiert und im Suchwörterbuch für schnellere Suchvorgänge gespeichert. " –

3

Aufschalten der GetHashCode() Methode für Ihr Objekt.

Natürlich gibt es hier eine kleine Falte ... GUIDs sind größer als Int32s, die .NET für Hashcodes verwendet.

+0

Das wird Ihnen nicht helfen" ein Objekt aus einem HashSet basierend auf dieser GUID allein zu erhalten " –

+0

@Marc : Der erste Teil der Frage besagt: "Diese Objekte haben bereits eine eindeutige ID von System.Guid, daher würde ich lieber das HashSet verwenden, anstatt die vorhandene ID zu verwenden, anstatt zu versuchen, selbst herauszufinden, wie man das Objekt hasht." Überschreibt HashSet Also, es gibt natürlich das kleine Problem, dass eine GUID vier mal so groß ist wie ein int32. – Powerlord