Hashsets и различные экземпляры класса со всеми идентичными членами - PullRequest
0 голосов
/ 22 августа 2009

Допустим, у меня есть класс myclass.

В моем коде у меня есть два экземпляра myclass, myclass1 и myclass2. Все в них (публичные и частные) свойства идентичны.

Если я попытаюсь добавить их обоих в HashSet, он добавит оба или только один? Если он добавляет и то, и другое, а я этого не хочу, могу ли я переопределить equals в определении myclass и HasSet знает, как его использовать?

1 Ответ

2 голосов
/ 22 августа 2009

Краткий ответ, это зависит от метода Equals вашего объекта.

Более длинный ответ:

HashSet будет использовать IEqualityComparer, чтобы определить, равны ли два объекта. Если вы не предоставите один, он будет использовать EqualityComparer.Default; который эффективно использует только object.Equals (a, b) плюс некоторые вещи, чтобы избежать типов значений в боксе.

Проверка документов на object.Equals(a, b): фактически он просто выполняет a.Equals(b) после проверки на нулевые значения.

Реализация по умолчанию object.Equals(other) заключается в проверке только на равенство ссылок (т. Е. Они являются точно таким же экземпляром объекта), но вы можете переопределить это для выполнения любой проверки, например, проверки поля идентификатора идентичны. Обратите внимание, что при переопределении Equals также необходимо переопределить GetHashCode.

Если вы хотите изменить способ определения равенства HashSet без изменения определения объекта, вы можете вместо этого предоставить ему собственный IEqualityComparer.

...