Если я хочу использовать объекты в качестве ключей для a Dictionary
, какие методы мне нужно будет переопределить, чтобы они сравнивались определенным образом?
Скажем, у меня есть класс со свойствами:
class Foo {
public string Name { get; set; }
public int FooID { get; set; }
// elided
}
И я хочу создать:
Dictionary<Foo, List<Stuff>>
Я хочу, Foo
чтобы одинаковые объекты FooID
считались одной и той же группой. Какие методы мне нужно будет переопределить в Foo
классе?
Подводя итог: я хочу разбить Stuff
объекты на списки, сгруппированные по Foo
объектам. Stuff
объекты будут иметь FooID
ссылку на их категорию.
источник
Поскольку вы хотите,
FooID
чтобы это был идентификатор группы, вы должны использовать его в качестве ключа в словаре вместо объекта Foo:Если вы будете использовать
Foo
объект в качестве ключа, вы бы просто реализоватьGetHashCode
иEquals
метод рассматривать толькоFooID
свойство. СName
точки зрения свойства свойство будет просто мертвым грузомDictionary
, поэтому вы можете просто использовать егоFoo
в качестве оболочки дляint
.Поэтому лучше использовать
FooID
значение напрямую, и тогда вам не нужно ничего реализовывать, посколькуDictionary
уже поддерживается использованиеint
в качестве ключа.Изменить:
если вы
Foo
все равно хотите использовать класс в качестве ключа,IEqualityComparer<Foo>
это легко реализовать:Использование:
источник
Для Foo вам нужно будет переопределить object.GetHashCode () и object.Equals ()
Словарь вызовет GetHashCode () для вычисления хеш-сегмента для каждого значения и Equals для сравнения идентичности двух Foo.
Убедитесь, что вы вычислили хорошие хэш-коды (избегайте множества одинаковых объектов Foo, имеющих одинаковый хэш-код), но убедитесь, что два равных Foo имеют одинаковый хеш-код. Возможно, вы захотите начать с метода Equals, а затем (в GetHashCode ()) xor хэш-код каждого члена, который вы сравниваете в Equals.
источник
А как насчет
Hashtable
класса!Вышеупомянутым способом вы можете использовать любой объект (объект вашего класса) как общий ключ словаря :)
источник
У меня такая же проблема. Теперь я могу использовать любой объект, который пробовал, в качестве ключа из-за переопределения Equals и GetHashCode.
Вот класс, который я создал с методами для использования внутри переопределений Equals (объект obj) и GetHashCode (). Я решил использовать дженерики и алгоритм хеширования, который должен охватывать большинство объектов. Пожалуйста, дайте мне знать, если вы видите здесь что-то, что не работает для некоторых типов объектов, и у вас есть способ это улучшить.
Вот как это используется в классе:
источник