Почему c# hashSet принимает добавление двух объектов с одинаковым значением getHashCode ()?
У меня есть объект CustomObject, который переопределяет GetHashCode (). У меня есть HashSet, и я могу вызвать add с двумя различными объектами, имеющими один и тот же хэш-код. Оба добавляются, а позже я заканчиваю с некоторыми проблемами вставки базы данных (дубликаты первичного ключа)... Цель использования hashSet была связана с этими вставками базы данных (избегая коллизий ключей).
возможно ли, что я упускаю некоторые свойства HashSet ? Даже когда я пытаюсь проверить (.Содержит) перед добавлением (.Add), я в конечном итоге добавляю дубликаты хэш-кода...
3 ответов
, потому что HashSet<T>
членство основано на равенстве объектов, а не на равенстве хэш-кода. Это совершенно законно для каждого члена HashSet<T>
иметь один и тот же хэш-код, пока члены отличаются в соответствии с Equals
. Роль, которую играют хэш-коды в HashSet<T>
для быстрого тестирования членства. Если у вас есть объект и его хэш-код не в HashSet<T>
, то вы знаете, что объект не находится в HashSet<T>
. Если у вас есть объект и его хэш-код находится в HashSet<T>
, тогда вы нужно пройти цепочку объектов с тем же самым тестированием хэш-кода на равенство, используя Equals
чтобы увидеть, действительно ли объект находится в HashSet<T>
или нет. Вот почему важно сбалансированное распределение хэш-кода. Но это не тот случай, когда уникальный хэш-коды.
Do не используйте hashsets, чтобы попытаться избежать дублирования значений. Используйте их для баланса хэш-таблиц!