Хэшсеты и разные экземпляры класса со всеми идентичными членами

StackOverflow https://stackoverflow.com/questions/1314421

Вопрос

Допустим, у меня есть класс 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top