Jeśli chcę używać obiektów jako kluczy dla a Dictionary
, jakie metody będę musiał przesłonić, aby porównać je w określony sposób?
Powiedzmy, że mam klasę, która ma właściwości:
class Foo {
public string Name { get; set; }
public int FooID { get; set; }
// elided
}
I chcę stworzyć:
Dictionary<Foo, List<Stuff>>
Chcę, aby Foo
obiekty z tym samym FooID
były traktowane jako ta sama grupa. Jakie metody będę musiał przesłonić w Foo
klasie?
Podsumowując: chcę podzielić Stuff
obiekty na listy, pogrupowane według Foo
obiektów. Stuff
obiekty będą miały FooID
link do ich kategorii.
źródło
Ponieważ chcesz,
FooID
aby był identyfikatorem grupy, powinieneś użyć tego jako klucza w słowniku zamiast obiektu Foo:Jeśli chcesz użyć
Foo
obiektu jako klucza, po prostu zaimplementowałbyś metodęGetHashCode
andEquals
, aby uwzględnić tylkoFooID
właściwość.Name
Nieruchomość będzie tylko martwy ciężar w miaręDictionary
chodzi, więc po prostu użyćFoo
jako wrapper dlaint
.Dlatego lepiej jest użyć
FooID
wartości bezpośrednio, a wtedy nie musisz niczego implementować, ponieważDictionary
już obsługuje używanieint
klucza jako klucza.Edycja:
jeśli
Foo
mimo wszystko chcesz użyć klasy jako klucza,IEqualityComparer<Foo>
jest to łatwe do zaimplementowania:Stosowanie:
źródło
W przypadku Foo musisz nadpisać object.GetHashCode () i object.Equals ()
Słownik wywoła GetHashCode (), aby obliczyć przedział mieszania dla każdej wartości i Equals, aby porównać, czy dwa Foo są identyczne.
Upewnij się, że obliczasz dobre kody skrótu (unikaj wielu równych obiektów Foo mających ten sam kod skrótu), ale upewnij się, że dwa równe Foos mają ten sam kod skrótu. Możesz zacząć od metody Equals, a następnie (w GetHashCode ()) xorować kod skrótu każdego elementu członkowskiego, który porównujesz w Equals.
źródło
A co z
Hashtable
klasą!W powyższy sposób możesz użyć dowolnego obiektu (obiektu Twojej klasy) jako ogólnego klucza Dictionary :)
źródło
Miałem ten sam problem. Teraz mogę użyć dowolnego obiektu, który wypróbowałem, jako klucza z powodu zastąpienia Equals i GetHashCode.
Oto klasa, którą zbudowałem z metodami do użycia wewnątrz przesłonięć Equals (obiekt obj) i GetHashCode (). Zdecydowałem się użyć typów ogólnych i algorytmu haszującego, który powinien być w stanie objąć większość obiektów. Daj mi znać, jeśli zobaczysz tutaj coś, co nie działa w przypadku niektórych typów obiektów i masz sposób, aby to poprawić.
Oto jak jest używany na zajęciach:
źródło