HashSet<T> t = new HashSet<T>();
// add 10 million items
Dictionary<K, V> t = new Dictionary<K, V>();
// add 10 million items.
Чей .Contains
метод быстрее вернется?
Чтобы прояснить, мое требование: у меня есть 10 миллионов объектов (ну, на самом деле строк), которые мне нужно проверить, существуют ли они в структуре данных. Я НИКОГДА не буду повторять.
.net
performance
dictionary
hashset
Halivingston
источник
источник
Ответы:
Тест производительности HashSet vs List vs Dictionary, взятый отсюда .
Добавить 1000000 объектов (без проверки дубликатов)
Содержит проверку на половину объектов коллекции из 10000
Уберите половину предметов коллекции из 10000
источник
Я так понимаю, вы имеете
Dictionary<TKey, TValue>
в виду второй случай?HashTable
не общий класс.Вы должны выбрать подходящую коллекцию для работы, исходя из ваших реальных требований. Вы действительно хотите сопоставить каждый ключ со значением? Если да, используйте
Dictionary<,>
. Если вам нужен только набор, используйтеHashSet<>
.Я ожидал бы, что
HashSet<T>.Contains
иDictionary<TKey, TValue>.ContainsKey
(которые являются сопоставимыми операциями, если вы разумно используете свой словарь) будут в основном выполнять то же самое - в основном они используют один и тот же алгоритм. Я предполагаю, что с увеличением количества записейDictionary<,>
вы получите большую вероятность взорвать кеш,Dictionary<,>
чем сHashSet<>
, но я ожидал бы, что это будет незначительно по сравнению с болью выбора неправильного типа данных просто с точки зрения того, что вы пытаюсь достичь.источник
Dictionary
по другим причинам, вам следует использовать его.Из документации MSDN для Dictionary <TKey, TValue>
С примечанием:
Я знаю, что ваш вопрос / сообщение устарело, но, ища ответ на аналогичный вопрос, я наткнулся на него.
Надеюсь это поможет. Прокрутите вниз до раздела « Примечания » для получения более подробной информации. https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx
источник
Это разные структуры данных. Также нет универсальной версии
HashTable
.HashSet
содержит значения типа T, которыйHashTable
(илиDictionary
) содержит пары ключ-значение. Поэтому вам следует выбрать сбор, какие данные вам нужно хранить.источник
Принятый ответ на этот вопрос НЕ является правильным ответом на вопрос! Бывает, что даётся правильный ответ, но этот ответ не подтверждается предоставленными доказательствами.
Этот ответ показывает, что поиск ключей в
Dictionary
илиHashSet
намного быстрее, чем поиск вList
. Что верно, но не интересно, не удивительно и не доказывает, что у них одинаковая скорость.Я запустил приведенный ниже код, чтобы сравнить время поиска, и пришел к выводу, что они действительно имеют одинаковую скорость. (Или, по крайней мере, если есть какая-то разница, то разница находится в пределах стандартного отклонения этой скорости)
В частности, для меня в этом тесте 100000000 поисков занимали от 10 до 11,5 секунд для обоих.
Код теста:
источник