Si je veux utiliser des objets comme clés pour un Dictionary
, quelles méthodes devrai-je remplacer pour les comparer d'une manière spécifique?
Disons que j'ai une classe qui a des propriétés:
class Foo {
public string Name { get; set; }
public int FooID { get; set; }
// elided
}
Et je veux créer un:
Dictionary<Foo, List<Stuff>>
Je veux que les Foo
objets avec le même FooID
soient considérés comme le même groupe. Quelles méthodes dois-je remplacer dans la Foo
classe?
Pour résumer: je souhaite classer les Stuff
objets en listes, groupées par Foo
objets. Stuff
les objets auront un FooID
pour les lier à leur catégorie.
la source
Comme vous voulez que le
FooID
soit l'identificateur du groupe, vous devez l'utiliser comme clé dans le dictionnaire au lieu de l'objet Foo:Si vous utilisiez l'
Foo
objet comme clé, vous implémenteriez simplement la méthodeGetHashCode
andEquals
pour ne considérer que laFooID
propriété. LaName
propriété serait juste un poids mort en ce quiDictionary
concerne le, donc vous ne l'utiliseriezFoo
que comme wrapper pour un fichierint
.Par conséquent, il est préférable d'utiliser la
FooID
valeur directement, et vous n'avez alors rien à implémenter car leDictionary
prend déjà en charge l'utilisation de anint
comme clé.Edit:
Si vous voulez
Foo
quand même utiliser la classe comme clé, leIEqualityComparer<Foo>
est facile à implémenter:Usage:
la source
Pour Foo, vous devrez remplacer object.GetHashCode () et object.Equals ()
Le dictionnaire appellera GetHashCode () pour calculer un compartiment de hachage pour chaque valeur et Equals pour comparer si deux Foo sont identiques.
Assurez-vous de calculer de bons codes de hachage (évitez que de nombreux objets Foo égaux aient le même hashcode), mais assurez-vous que deux Foos égaux ont le même code de hachage. Vous voudrez peut-être commencer par la méthode Equals, puis (dans GetHashCode ()) xou le code de hachage de chaque membre que vous comparez dans Equals.
la source
Et la
Hashtable
classe!De la manière ci-dessus, vous pouvez utiliser n'importe quel objet (votre objet de classe) comme clé de dictionnaire générique :)
la source
J'ai eu le même problème. Je peux maintenant utiliser n'importe quel objet que j'ai essayé comme clé en raison de la substitution de Equals et GetHashCode.
Voici une classe que j'ai construite avec des méthodes à utiliser à l'intérieur des substitutions de Equals (object obj) et GetHashCode (). J'ai décidé d'utiliser des génériques et un algorithme de hachage qui devrait pouvoir couvrir la plupart des objets. Veuillez me faire savoir si vous voyez quelque chose ici qui ne fonctionne pas pour certains types d'objets et que vous avez un moyen de l'améliorer.
Voici comment il est utilisé dans une classe:
la source