Intereting Posts
ссылка на общий тип в комментарии кода XML создать динамическую бомбу телеграммы в c #, API MrRoundRobin Логика теперь является polymorphismом вместо коммутатора, но как насчет построения? .Net перечислять стили шрифтов winforms? C #: как установить номер версии сборки Как сделать объекты прозрачными в OpenTK Многострочный поиск регулярного выражения в целом файле Отражение. Что мы можем добиться от этого? Confused about CollectionViewSource (SelectedItem не работает в комбо) Что такое «длинный»? тип данных? Windows Phone 8.1 Навигация по страницам «Операция может дестабилизировать время выполнения» и DynamicMethod со значениями типов Тип одного из значений первичного ключа не соответствовал типу, определенному в объекте. См. Внутреннее исключение для подробностей Установка свойства «KeepPrintedDocuments» на принтере в .NET. Использование AutoMapper для сопоставления свойства объекта с строкой

Является ли HashSet таким же, как List , но с уникальностью?

Мне нужно иметь возможность иметь уникальные элементы в коллекции.

Я собирался использовать словарь, чтобы использовать метод ContainsKey, но я думал, что это будет пустой тратой, поскольку я не буду использовать свойство Value пары Key / Value.

Я наткнулся на HashSet который выглядит очень многообещающим. Единственное, что я могу найти, что не могу найти в List docs, – это то, что HashSet неупорядочен. Я думаю, что все в порядке, я предполагаю, что это означает, что он не упорядочен с использованием IEqualityComparer . Пока порядок, в котором элементы добавлены, находится в одной и той же позиции индекса, я думаю, что это будет нормально, так как мне нужно выполнить повторную проверку, следовательно, хешсет, а затем проверить, что все записи последовательны.

Есть ли что-то еще, что я пропустил, сравнивая два типа?

Нет, важно, что HashSet не имеет понятия упорядочения или индексирования – список концептуально имеет слоты 0 …. n-1, тогда как набор «просто набор».

Я думаю, что все в порядке, я предполагаю, что это означает, что он не упорядочен с использованием IEqualityComparer.

IEqualityComparer не используется для заказа в любом случае – он говорит только о равенстве и hash-кодах. HashSet не упорядочивается ни сравнением элементов (как, скажем, SortedSet ), так и порядком вставки.

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

Позиция индекса отсутствует, и когда вы перебираете HashSet нет никакой гарантии, что вы вернете их в том порядке, в котором вы их добавили. Если вы даже подумываете о заказе, HashSet – это не то, что вам нужно.

Опять же, все это также относится к Dictionary – вы также не должны делать никаких предположений о заказе.

Это «картина» того, что выглядит List :

 List: |a|b|r|t|i|p|c|y|z|... Index: |0|1|2|3|4|5|6|7|8|... 

List представляет, ну, список элементов. Вы можете обратиться к элементу по его позиции в списке.

Это «картина» того, что выглядит HashSet :

 Set: |a|b|c| | | | | |i| | | | | | |p| |r| |t| | | | |y|z| Bucket: |a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z| 

HashSet представляет набор уникальных элементов. У каждого предмета есть свое «ведро». Вы можете ссылаться на элемент по его ведро. Ведро, к которому принадлежит элемент, вычисляется непосредственно из элемента.

Одним из преимуществ использования HashSet над List является поиск по постоянному времени. В List элемент может находиться в любом месте в List , поэтому, чтобы найти его, вам нужно просмотреть каждый элемент в List . В HashSet существует только одно возможное местоположение для любого данного элемента. Поэтому, чтобы искать элемент, все, что вам нужно сделать, это посмотреть в его ведро. Если он есть, он есть, если нет, это не так.

Иллюстрации могут быть не на 100% точными (для простоты). Особенно пример HashSet .

Нет. HashSet не разрешает доступ через индекс, потому что элементы не упорядочены. Это не означает, как вы подозреваете, что они не упорядочены в соответствии с некоторыми IEqualityComparer . Это означает, что они не хранятся внутри хеш-набора в порядке их добавления.

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

Похоже, это то, что вам нужно:

 class UniqueList : Collection { protected override void InsertItem(int index, T item) { if (!base.Contains(item)) { base.InsertItem(index, item); } else { // whatever } } } 

Вызов UniqueList.Add добавит элемент в конец списка и не будет добавлять повторяющиеся значения.

Хорошо HashSet концептуально представляет собой List уникальных значений, но в отличие от List он фактически не реализует интерфейс IList , а реализует ICollection . Кроме того, он имеет набор специальных функций, таких как:

Intersection , IsSubsetOf , IsSupersetOf , Union, List не имеет.

Естественно, эти функции удобны при работе с несколькими HasSet s.

Вы слегка ошиблись. Ни Dictionary ни HashSet сохраняют порядок элементов, это означает, что вы не можете полагаться на индекс элемента. Теоретически вы можете использовать LINQ ElementAt() для доступа к элементу по индексу, но опять же обе коллекции не гарантируют, что порядок сохранен.

.NET предоставляет class OrderedDictionary , но он не является общим, поэтому во время компиляции у вас не будет безопасности типа. В любом случае он позволяет получать доступ к элементам по индексу.

Вот обычная реализация родового: OrderedDictionary (of T): Общая реализация IOrderedDictionary . Ключевой момент: он сохраняет две коллекции – List и Dictionary одновременно; Список обеспечивает доступ по индексу, а Dictionary обеспечивает быстрый доступ с помощью ключа.