2009-06-08 7 views
1

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

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

ответ

4

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

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

1

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

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

1

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

+0

Будьте осторожны, так как KeyedCollection по умолчанию использует словарь по умолчанию: -P Из документации «По умолчанию , KeyedCollection включает в себя поиск Словарь. Когда элемент добавляется в KeyedCollection , ключ элемента извлекается один раз и сохраняется в поисковом словаре для более быстрого поиска. » –

3

Override метод GetHashCode() для вашего объекта.

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

+0

Это не поможет вам« получить объект из HashSet на основе этого Руководства » –

+0

@Marc : Первая часть поставленного вопроса: «У этих объектов уже есть уникальный идентификатор System.Guid, поэтому я бы предпочел, чтобы HashSet просто использовал этот существующий идентификатор, а затем пытался выяснить, как хэш-объект». Переопределение HashSet делает поэтому, конечно, есть небольшая проблема, что GUID в четыре раза больше размера int32. – Powerlord

 Смежные вопросы

  • Нет связанных вопросов^_^