Se eu quiser usar objetos como chaves para a Dictionary
, quais métodos precisarei substituir para fazê-los comparar de uma maneira específica?
Digamos que eu tenho uma classe que possui propriedades:
class Foo {
public string Name { get; set; }
public int FooID { get; set; }
// elided
}
E eu quero criar um:
Dictionary<Foo, List<Stuff>>
Quero que Foo
objetos com o mesmo FooID
sejam considerados o mesmo grupo. Quais métodos precisarei substituir na Foo
classe?
Para resumir: eu quero categorizar Stuff
objetos em listas, agrupadas por Foo
objetos. Stuff
os objetos terão um FooID
para vinculá-los à sua categoria.
fonte
Como você deseja
FooID
que seja o identificador do grupo, use-o como chave no dicionário, em vez do objeto Foo:Se você usasse o
Foo
objeto como chave, implementaria apenas o métodoGetHashCode
eEquals
para considerar apenas aFooID
propriedade AName
propriedade teria um peso morto no queDictionary
dizia respeito, então você usaria apenasFoo
como um invólucro para umint
.Portanto, é melhor usar o
FooID
valor diretamente e, assim, você não precisa implementar nada,Dictionary
já que ele já suporta o uso de umaint
chave.Editar:
se você quiser usar a
Foo
classe como chave de qualquer maneira,IEqualityComparer<Foo>
é fácil implementar:Uso:
fonte
Para Foo, você precisará substituir object.GetHashCode () e object.Equals ()
O dicionário chamará GetHashCode () para calcular um intervalo de hash para cada valor e Equals para comparar se dois Foo's são idênticos.
Calcule bons códigos de hash (evite que objetos Foo iguais tenham o mesmo código de hash), mas certifique-se de que dois Foos iguais tenham o mesmo código de hash. Você pode começar com o método Equals e, em seguida, (em GetHashCode ()) ou o código de hash de cada membro que você comparar em iguais.
fonte
E a
Hashtable
aula!Da maneira acima, você pode usar qualquer objeto (seu objeto de classe) como uma chave genérica do Dicionário :)
fonte
Eu tive o mesmo problema. Agora posso usar qualquer objeto que tentei como chave devido à substituição de Equals e GetHashCode.
Aqui está uma classe que eu criei com métodos para usar dentro das substituições de Equals (object obj) e GetHashCode (). Decidi usar genéricos e um algoritmo de hash que deveria cobrir a maioria dos objetos. Informe-me se vir algo aqui que não funcione para alguns tipos de objeto e se você tem uma maneira de aprimorá-lo.
Aqui está como é usado em uma classe:
fonte