Comment puis-je contrôler la façon dont un objet est haché par un HashSet
Question
J'utilise un HashSet<T>
pour stocker une collection d'objets. Ces objets ont déjà un identifiant unique de System.Guid
, donc je préfère l'utiliser HashSet<>
juste que ID existant plutôt que d'essayer de comprendre lui-même comment l'objet de hachage. Comment remplacer la construction dans le hachage et la force de mon programme à utiliser la construction de la valeur d'identité comme la valeur de hachage?
dis aussi que je connais le Guid
d'un objet dans mon HashSet<>
, est-il un moyen d'obtenir un objet d'un HashSet<T>
basé sur ce Guid
seul? Ou devrais-je utiliser un dictionnaire à la place.
La solution
Un HashSet<>
ne repose pas une paire clé / valeur, et ne fournit pas l'accès « par la touche » - il est juste un ensemble de valeurs uniques, en utilisant le hachage pour vérifier le confinement très rapidement
Pour utiliser une paire de clés / valeur (pour aller chercher par Guid
plus tard) l'option la plus simple serait un Dictionary<Guid,SomeType>
. Le code de hachage existant sur Guid
devrait être bien (bien que si vous avez besoin (vous n'êtes pas ici), vous pouvez fournir un IEqualityComparer<T>
à utiliser pour le hachage.
Autres conseils
Remplacer la méthode GetHashCode()
pour votre objet .
Bien sûr, il y a une légère ride ici ... GUIDs sont plus grandes que INT32, qui utilise .NET pour hashcodes.
Pourquoi avez-vous besoin de passer outre cela? semble être peut-être une optimisation prématurée.
Oui, il suffit d'utiliser un dictionnaire. Une fois que vous développez votre application, passer par une phase d'optimisation des performances où l'on mesure la performance de l'ensemble de votre code. Si et seulement si cette fonction de hachage montre comme étant votre plus grand drainage devriez-vous envisager une structure de données plus performante (s'il y a une toute façon): -)
Essayez de regarder dans System.KeyedCollection . Il vous permet d'intégrer la connaissance du domaine clé dans votre mise en œuvre de la collection.