Можете ли вы объяснить, в чем разница между HashSet<T>
и List<T>
в .NET?
Может быть, вы можете объяснить на примере, в каких случаях HashSet<T>
следует отдавать предпочтение List<T>
?
.net
list
hashset
difference
pencilCake
источник
источник
Ответы:
В отличие от списка <> ...
HashSet - это список без повторяющихся членов.
Поскольку HashSet ограничен, чтобы содержать только уникальные записи, внутренняя структура оптимизирована для поиска (по сравнению со списком) - это значительно быстрее
Добавление в HashSet возвращает логическое значение - false, если добавление не выполняется из-за того, что оно уже существует в Set
Может выполнять математические операции над множествами: объединение / пересечение / IsSubsetOf и т. Д.
HashSet не реализует IList только ICollection
Вы не можете использовать индексы с HashSet, только перечислители.
Основная причина использования HashSet может быть связана с тем, что вы заинтересованы в выполнении операций Set.
Дано 2 набора: hashSet1 и hashSet2
вылетает по сравнению с эквивалентной операцией с использованием LINQ. Это также аккуратнее писать!
источник
Union
методом. Я использовалUnionWith
вместо этого.Чтобы быть более точным, давайте продемонстрируем на примерах,
Вы не можете использовать HashSet, как в следующем примере.
hashSet1[i]
выдаст ошибку:Вы можете использовать оператор foreach:
Вы не можете добавлять дублирующиеся элементы в HashSet, пока List позволяет вам это делать, и когда вы добавляете элемент в HashSet, вы можете проверить, содержит он элемент или нет.
HashSet имеет некоторые полезные функции , такие как
IntersectWith
,UnionWith
,IsProperSubsetOf
,ExceptWith
, иSymmetricExceptWith
т.д.IsProperSubsetOf
:UnionWith
:IntersectWith
:ExceptWith
:SymmetricExceptWith
:Кстати, порядок не сохраняется в HashSets. В примере мы добавили элемент «2» последним, но он во втором порядке:
источник
A
HashSet<T>
- это класс, предназначенный дляO(1)
поиска содержимого (например, содержит ли эта коллекция определенный объект и быстро ответит мне).A
List<T>
- это класс, предназначенный для предоставления вам коллекции сO(1)
произвольным доступом, которая может динамически расти (например, динамический массив). Вы можете проверить тестирование воO(n)
времени (если список не отсортирован, тогда вы можете выполнить бинарный поиск воO(log n)
времени).Когда вы хотите проверить содержание в
O(1)
.источник
Используйте,
List<T>
когда вы хотите:Если вы знаете индекс элемента, который вы хотите (а не значение самого элемента) получить
O(1)
. Если вы не знаете индекс, поиск элемента занимает больше времениO(n)
для несортированной коллекции.Используйте,
Hashset<T>
когда вы хотите:Если вы знаете название вещи, которую хотите найти, Lookup - это
O(1)
(это часть 'Hash'). Он не поддерживает порядок, какList<T>
делает, и вы не можете хранить дубликаты (добавление дубликатов не имеет никакого эффекта, это часть «Установить»).Примером использования a
Hashset<T>
может быть, если вы хотите узнать, является ли слово, играемое в игре Scrabble, допустимым словом на английском (или другом языке). Еще лучше было бы, если бы вы хотели создать веб-сервис, который будет использоваться всеми экземплярами онлайн-версии такой игры.A
List<T>
была бы хорошей структурой данных для создания табло для отслеживания результатов игрока.источник
Список - это упорядоченный список. это
HashSet - это набор. Это:
Список более уместен, когда вы хотите получить доступ к своей коллекции, как если бы она была похожа на массив, к которому вы могли бы добавлять, вставлять и удалять элементы. HashSet - лучший выбор, если вы хотите относиться к своей коллекции как к «сумке» предметов, порядок которых не важен, или когда вы хотите сравнить ее с другими наборами, используя такие операции, как IntersectWith или UnionWith.
источник
Список не обязательно уникален, в то время как hashset для одного.
источник
Список - это упорядоченная коллекция объектов типа T, в отличие от массива, вы можете добавлять и удалять записи.
Вы бы использовали список, в котором вы хотите ссылаться на участников в том порядке, в котором вы их сохранили, и вы получаете к ним доступ по позиции, а не по самому элементу.
HashSet похож на словарь, в котором сам элемент является ключом и значением, порядок не гарантируется.
Вы бы использовали HashSet, где вы хотите проверить, что объект находится в коллекции
источник
List
поддерживает порядок (то есть, когда вещи были добавлены), но не сортирует элементы автоматически. Вам придется позвонить.Sort
или использоватьSortedList
.Если вы решите применить эти структуры данных для фактического использования в разработке, управляемой данными, HashSet ОЧЕНЬ будет полезен при тестировании репликации на источники адаптеров данных, для очистки и переноса данных.
Кроме того, при использовании класса DataAnnotations можно реализовать логику Key для свойств класса и эффективно управлять естественным индексом (кластеризованным или нет) с помощью HashSet, где это будет очень трудно реализовать в List.
Сильным вариантом использования списка является реализация универсальных шаблонов для нескольких сред в модели представления, например, отправка списка классов в MVC-представление для помощника DropDownList, а также для отправки в виде конструкции JSON через WebApi. Этот список допускает типичную логику сбора классов и сохраняет гибкость для подхода, более похожего на «интерфейс», для вычисления модели одного представления для различных сред.
источник