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 Fooobjetos con lo mismo FooIDse consideren del mismo grupo. ¿Qué métodos necesitaré anular en la Fooclase?
Para resumir: quiero categorizar Stuffobjetos en listas, agrupadas por Fooobjetos. Stufflos objetos tendrán una FooIDpara vincularlos a su categoría.
fuente

Como desea
FooIDque sea el identificador del grupo, debe usarlo como clave en el diccionario en lugar del objeto Foo:Si usara el
Fooobjeto como clave, simplemente implementaría el métodoGetHashCodeyEqualspara considerar solo laFooIDpropiedad. LaNamepropiedad sería un peso muerto en lo queDictionaryrespecta a, por lo que solo se usaríaFoocomo envoltorio para unint.Por lo tanto, es mejor usar el
FooIDvalor directamente, y luego no tiene que implementar nada, ya queDictionaryya admite el uso deintcomo clave.Editar:
si desea usar la
Fooclase 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
Hashtableclase!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