Si quiero usar objetos como claves para a Dictionary
, ¿qué métodos necesitaré anular para hacer que se comparen de una manera específica?
Digamos que tengo una clase que tiene propiedades:
class Foo {
public string Name { get; set; }
public int FooID { get; set; }
// elided
}
Y quiero crear un:
Dictionary<Foo, List<Stuff>>
Quiero que los Foo
objetos con lo mismo FooID
se consideren del mismo grupo. ¿Qué métodos necesitaré anular en la Foo
clase?
Para resumir: quiero categorizar Stuff
objetos en listas, agrupadas por Foo
objetos. Stuff
los objetos tendrán una FooID
para vincularlos a su categoría.
fuente
Como desea
FooID
que sea el identificador del grupo, debe usarlo como clave en el diccionario en lugar del objeto Foo:Si usara el
Foo
objeto como clave, simplemente implementaría el métodoGetHashCode
yEquals
para considerar solo laFooID
propiedad. LaName
propiedad sería un peso muerto en lo queDictionary
respecta a, por lo que solo se usaríaFoo
como envoltorio para unint
.Por lo tanto, es mejor usar el
FooID
valor directamente, y luego no tiene que implementar nada, ya queDictionary
ya admite el uso deint
como clave.Editar:
si desea usar la
Foo
clase como clave de todos modos,IEqualityComparer<Foo>
es fácil de implementar:Uso:
fuente
Para Foo, deberá anular object.GetHashCode () y object.Equals ()
El diccionario llamará a GetHashCode () para calcular un cubo hash para cada valor y Equals para comparar si dos Foo son idénticos.
Asegúrese de calcular buenos códigos hash (evite que muchos objetos Foo iguales tengan el mismo código hash), pero asegúrese de que dos Foos iguales tengan el mismo código hash. Es posible que desee comenzar con Equals-Method y luego (en GetHashCode ()) xo el código hash de cada miembro que compare en Equals.
fuente
¡Qué hay de la
Hashtable
clase!De la forma anterior, puede usar cualquier objeto (su objeto de clase) como una clave de diccionario genérica :)
fuente
Yo tuve el mismo problema. Ahora puedo usar cualquier objeto que haya probado como clave debido a que anula Equals y GetHashCode.
Aquí hay una clase que construí con métodos para usar dentro de las anulaciones de Equals (object obj) y GetHashCode (). Decidí usar genéricos y un algoritmo hash que debería poder cubrir la mayoría de los objetos. Por favor, avíseme si ve algo aquí que no funciona para algunos tipos de objeto y tiene una forma de mejorarlo.
Así es como se usa en una clase:
fuente