1 votes

Comment puis-je contrôler la façon dont un objet est haché par un hashset ?

J'utilise un HashSet<T> pour stocker une collection d'objets. Ces objets ont déjà un ID unique de System.Guid donc je préfère que le HashSet<> utilise simplement cet identifiant existant plutôt que d'essayer de trouver lui-même comment hacher l'objet. Comment puis-je remplacer le hachage intégré et forcer mon programme à utiliser la valeur de l'ID intégré comme valeur de hachage ?

Dites aussi que je connais le Guid d'un objet dans mon HashSet<> Est-ce qu'il existe un moyen d'obtenir un objet à partir d'un fichier de type HashSet<T> sur la base de ce qui suit Guid seul ? Ou dois-je plutôt utiliser un dictionnaire ?

4voto

Marc Gravell Points 482669

A HashSet<> n'est pas basé sur une paire clé/valeur, et ne fournit pas d'accès "par clé" - il s'agit simplement d'un ensemble de valeurs uniques, utilisant le hachage pour vérifier très rapidement le contenu.

Pour utiliser une paire clé/valeur (à rechercher par Guid plus tard), l'option la plus simple serait une Dictionary<Guid,SomeType> . Le code de hachage existant sur Guid devrait convenir (bien que si vous avez besoin (ce n'est pas le cas ici) vous pouvez fournir un IEqualityComparer<T> à utiliser pour le hachage.

3voto

Powerlord Points 43989

Remplacer le GetHashCode() pour votre objet.

Bien sûr, il y a un petit problème ici... Les GUID sont plus grands que les int32, que .NET utilise pour les codes de hachage.

1voto

Joel Martinez Points 22924

Pourquoi avez-vous besoin de remplacer cela ? Cela semble être une optimisation prématurée.

Oui, il suffit d'utiliser un dictionnaire. Une fois que vous avez développé votre application, passez par une phase d'optimisation des performances où vous mesurez les performances de tout votre code. Si et seulement si cette fonction de hachage s'avère être votre plus grand drain, vous devriez envisager une structure de données plus performante (s'il y en a une de toute façon) :-)

1voto

Gord Points 1434

Essayez de regarder dans System.KeyedCollection . Il vous permet d'intégrer la connaissance du champ clé dans la mise en œuvre de votre collection.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X