Как контролировать, как объект хешируется хэш-набором

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

  •  12-09-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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