Хэшсеты и разные экземпляры класса со всеми идентичными членами
-
19-09-2019 - |
Вопрос
Допустим, у меня есть класс myclass.
В моем коде есть два экземпляра myclass: myclass1 и myclass2.Все в них (государственное и частное) свойства идентичны.
Если я попытаюсь добавить их обоих в HashSet, он добавит оба или только один?Если он добавляет оба, а я этого не хочу, могу ли я переопределить равенства в определении myclass, и HasSet будет знать, как его использовать?
Решение
Короткий ответ: это зависит от метода Equals вашего объекта.
Более длинный ответ:
HashSet будет использовать IEqualityComparer, чтобы определить, равны ли два объекта.Если вы его не предоставите, он будет использовать EqualityComparer.Default
;который фактически просто использует object.Equals(a, b) плюс некоторые вещи, чтобы избежать упаковки типов значений.
Проверяем документы на object.Equals(a, b)
:По сути, это просто выполнение a.Equals(b)
после проверки на нули.
Реализация по умолчанию object.Equals(other)
заключается в проверке только равенства ссылок (т. е. они являются одним и тем же экземпляром объекта), но вы можете переопределить это, чтобы выполнить любую проверку, которая вам нравится, например проверку идентичности поля идентификатора.Обратите внимание: при переопределении Equals вам также необходимо переопределить GetHashCode.
Если вы хотите изменить способ определения равенства HashSet без изменения определения объекта, вы можете вместо этого предоставить ему собственный IEqualityComparer.