Коллекция C# Set?

Кто-нибудь знает, есть ли хороший эквивалент коллекции Java Set на C#? Я знаю, что вы можете имитировать набор с использованием Dictionary или HashTable, заполняя, но игнорируя значения, но это не очень элегантный способ.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
513
0
386 595
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Попробуйте HashSet:

The HashSet(Of T) class provides high-performance set operations. A set is a collection that contains no duplicate elements, and whose elements are in no particular order...

The capacity of a HashSet(Of T) object is the number of elements that the object can hold. A HashSet(Of T) object's capacity automatically increases as elements are added to the object.

The HashSet(Of T) class is based on the model of mathematical sets and provides high-performance set operations similar to accessing the keys of the Dictionary(Of TKey, TValue) or Hashtable collections. In simple terms, the HashSet(Of T) class can be thought of as a Dictionary(Of TKey, TValue) collection without values.

A HashSet(Of T) collection is not sorted and cannot contain duplicate elements...

К сожалению, HashSets не были добавлены до недавнего времени. Если вы работаете в более старой версии фреймворка, вам придется придерживаться своего измененного Dictionary <> или Hashtable.

Greg D 08.10.2008 20:36

Если вы используете .NET 3.5, вы можете использовать HashSet<T>. Это правда, что .NET не обслуживает наборы так же хорошо, как Java.

Wintellect PowerCollections тоже может помочь.

кто-нибудь знает, почему это называется HashSet, а не просто Set?

Wouter 24.06.2009 11:57

Я подозреваю, что Set - это ключевое слово в некоторых языках, которое может вызвать проблемы.

Jon Skeet 24.06.2009 12:10

set также является ключевым словом в C#

Manish Sinha 17.04.2010 09:42

@Manish: Нет, это не так. См. Раздел 2.4.3 спецификации C# 3. Это имеет особое значение только для свойств.

Jon Skeet 17.04.2010 10:40

@Jon Спасибо за просветление. Я всегда думал, что это ключевое слово. Скачал спецификацию C# 3.

Manish Sinha 17.04.2010 11:03

Причина, по которой он называется HashSet, а не просто Set, та же, что и в Java - «Set» описывает интерфейс, тогда как «HashSet» описывает реализацию - в частности, это Set, поддерживаемый Hash Map. Таким образом, мы знаем (или должны строго ожидать), что вставка и доступ должны занимать время доступа O (1), в отличие от «LinkedListSet», что заставляет нас ожидать, что вставка и доступ займут время O (n).

David Souther 16.07.2010 20:16

что вы имеете в виду: «.NET не обслуживает наборы так же хорошо, как Java»? Этот набор чем-то несовершенный по сравнению с Java?

Louis Rhys 28.02.2011 06:13

@ Луис: О каком наборе ты говоришь? В Java есть лоты различных реализаций Set для различных ситуаций. У .NET был один в .NET 3.5 (HashSet) и два в .NET 4 (HashSet и SortedSet). Тот факт, что нам пришлось дождаться появления .NET 3.5 для начала, довольно удивителен.

Jon Skeet 28.02.2011 11:20

Пользуюсь Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx

Он используется во многих проектах OSS, впервые я столкнулся с ним в NHibernate.

Взгляните на PowerCollections на CodePlex. Помимо Set и OrderedSet у него есть несколько других полезных типов коллекций, таких как Deque, MultiDictionary, Bag, OrderedBag, OrderedDictionary и OrderedMultiDictionary.

Для других коллекций есть также Библиотека общих коллекций C5.

Я использую оболочку вокруг Dictionary<T, object>, сохраняя в значениях нули. Это дает O (1) добавление, поиск и удаление ключей, и во всех смыслах и целях действует как набор.

Вы должны иметь в виду, что это примерно эквивалентно std :: unordered_set. std :: set заказан. Например, вы можете быстро найти начальную и конечную точку диапазона и выполнить итерацию от начала до конца, просматривая элементы в порядке нажатия клавиш. SortedDictionary является примерно эквивалентен std :: set.

doug65536 04.02.2013 11:43

Я знаю, что это старый поток, но я столкнулся с той же проблемой и обнаружил, что HashSet очень ненадежен, потому что при одном и том же начальном значении GetHashCode () возвращал разные коды. Итак, я подумал, почему бы просто не использовать список и не скрыть метод добавления, подобный этому

public class UniqueList<T> : List<T>
{
    public new void Add(T obj)
    {
        if (!Contains(obj))
        {
            base.Add(obj);
        }
    }
}

Поскольку List использует метод Equals исключительно для определения равенства, вы можете определить метод Equals для своего типа T, чтобы получить желаемые результаты.

Причина, по которой вы не захотите использовать это, заключается в том, что List.Contains имеет сложность O(n), что означает, что ваш метод Add теперь также становится сложным O(n). Предполагая, что размер внутренней коллекции не нужно изменять, Add для List и HashMap должен иметь сложность O(1). TL; DR: это будет работать, но это хакерский и менее эффективный способ.

Richard Marskell - Drackir 25.02.2012 00:28

Конечно, если ваши объекты не возвращают подходящее значение для GetHashCode, вы не должны помещать их в контейнер на основе хешей. Лучше исправить GetHashCode, чем использовать менее эффективный контейнер.

bmm6o 05.03.2012 21:40

Если вы используете .NET 4.0 или новее:

В случае, если вам нужна сортировка, используйте SortedSet<T>. В противном случае, если вы этого не сделаете, используйте HashSet<T>, поскольку это O(1) для операций поиска и управления. В то время как SortedSet<T> - это O(log n) для операций поиска и управления.

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