Как я могу контролировать, как объект хэшируется - PullRequest
1 голос
/ 09 июня 2009

Я использую HashSet<T> для хранения коллекции объектов. Эти объекты уже имеют уникальный идентификатор System.Guid, поэтому я бы предпочел HashSet<> просто использовать этот существующий идентификатор, а не пытаться выяснить, как хэшировать объект. Как переопределить хэширование сборки и заставить мою программу использовать значение идентификатора сборки в качестве значения хеша?

Также скажите, что я знаю Guid объекта в моем HashSet<>, есть ли способ получить объект из HashSet<T> на основе только этого Guid? Или я должен использовать словарь вместо этого.

Ответы [ 4 ]

4 голосов
/ 09 июня 2009

A HashSet<> не основывается на паре ключ / значение и не предоставляет доступа «по ключу» - это просто набор уникальных значений, использующих хеш для очень быстрой проверки содержимого.

Чтобы использовать пару ключ / значение (для получения Guid позже), простейшим вариантом будет Dictionary<Guid,SomeType>. С существующим хеш-кодом на Guid должно быть все в порядке (хотя , если вам нужно (вас здесь нет), вы можете предоставить IEqualityComparer<T> для использования для хеширования.

3 голосов
/ 09 июня 2009

Переопределите метод GetHashCode() для вашего объекта.

Конечно, здесь есть небольшая складка ... GUID больше, чем int32, которые .NET использует для хэш-кодов.

1 голос
/ 09 июня 2009

Попробуйте просмотреть System.KeyedCollection . Это позволяет встраивать знания о ключевом поле в реализацию вашей коллекции.

1 голос
/ 09 июня 2009

Зачем вам нужно это переопределить? кажется, возможно, преждевременная оптимизация.

Да, просто используйте словарь. Как только вы разработаете свое приложение, пройдите этап настройки производительности, где вы измеряете производительность всего своего кода. Если и только если эта функция хеширования показывает, что она является самой большой утечкой, следует ли вам рассмотреть более производительную структуру данных (если она есть в любом случае):

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...