Frage

Ich benutze a HashSet<T> eine Sammlung von Objekten speichern. Diese Objekte haben bereits eine eindeutige ID von System.Guid, also würde ich lieber das HashSet<> Verwenden Sie einfach diese vorhandene ID und versuchen Sie es, sich selbst herauszufinden, wie das Objekt hasht. Wie überschreibe ich den Build in Hashing und zwinge mein Programm, den Build im ID -Wert als Hash -Wert zu verwenden?

Sagen Sie auch, ich kenne das Guid eines Objekts in meinem HashSet<>, Gibt es eine Möglichkeit, ein Objekt von a zu bekommen HashSet<T> basierend auf Guid allein? Oder sollte ich stattdessen ein Wörterbuch verwenden.

War es hilfreich?

Lösung

EIN HashSet<> ist kein Schlüssel-/Wertpaar und bietet nein "nach Schlüssel" -Access - es handelt sich nur um eine Reihe von eindeutigen Werten, wobei der Hash sehr schnell überprüft wird.

Um ein Schlüssel-/Wertpaar zu verwenden (um nach abzurufen Guid später) die einfachste Option wäre a Dictionary<Guid,SomeType>. Der vorhandene Hash-Code auf Guid sollte in Ordnung sein (obwohl Wenn Sie brauchten (Sie nicht hier) Sie können eine bereitstellen IEqualityComparer<T> zum Hashing verwenden.

Andere Tipps

Überschreiben die GetHashCode() Methode für Ihr Objekt.

Natürlich gibt es hier eine leichte Falte ... Guids sind größer als int32s, die .NET für Hashcodes verwendet.

Warum müssen Sie dies außer Kraft setzen? Scheint vielleicht eine vorzeitige Optimierung.

Ja, benutze einfach ein Wörterbuch. Sobald Sie Ihre Anwendung entwickelt haben, gehen Sie eine Leistungsstimmphase durch, in der Sie die Leistung Ihres Codes messen. Wenn und nur wenn diese Hashing-Funktion als größter Abfluss zeigt, falls Sie eine leistungsfähigere Datenstruktur in Betracht ziehen (falls es eine gibt) :-)

Versuchen Sie es zu schauen System.KeyedCollection. Sie können das Wissen über das Schlüsselfeld in Ihre Sammlungsimplementierung einbetten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top