Кто-нибудь знает, есть ли хороший эквивалент Set
коллекции Java в C #? Я знаю, что вы можете имитировать набор, используя a Dictionary
или a HashTable
, заполняя, но игнорируя значения, но это не очень элегантный способ.
источник
Кто-нибудь знает, есть ли хороший эквивалент Set
коллекции Java в C #? Я знаю, что вы можете имитировать набор, используя a Dictionary
или a HashTable
, заполняя, но игнорируя значения, но это не очень элегантный способ.
Попробуйте HashSet :
Класс HashSet (Of T) обеспечивает высокопроизводительные операции над множествами. Набор - это коллекция, которая не содержит повторяющихся элементов и элементы которой расположены в произвольном порядке ...
Емкость объекта HashSet (Of T) - это количество элементов, которые объект может содержать. Емкость объекта HashSet (Of T) автоматически увеличивается при добавлении элементов в объект.
Класс HashSet (Of T) основан на модели математических множеств и обеспечивает высокопроизводительные операции над множествами, аналогичные доступу к ключам из словарей (Of TKey, TValue) или коллекций Hashtable . Проще говоря, класс HashSet (Of T) можно рассматривать как коллекцию Dictionary (Of TKey, TValue) без значений.
Коллекция HashSet (Of T) не отсортирована и не может содержать повторяющиеся элементы ...
Если вы используете .NET 3.5, вы можете использовать
HashSet<T>
. Это правда, что .NET не обслуживает наборы так же хорошо, как Java.В PowerCollections Wintellect может помочь тоже.
источник
Если вы используете .NET 4.0 или более позднюю версию:
Если вам нужна сортировка, используйте
SortedSet<T>
. В противном случае, если вы этого не сделаете, используйтеHashSet<T>
егоO(1)
для поиска и манипулирования операциями. Принимая во внимание,SortedSet<T>
чтоO(log n)
для поиска и манипулирования операциями.источник
Я использую Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx
Он используется во многих проектах OSS, я впервые столкнулся с ним в NHibernate
источник
Я использую обертку вокруг
Dictionary<T, object>
, сохраняя нули в значениях. Это дает O (1) добавление, поиск и удаление ключей, и для всех намерений и целей действует как набор.источник
Посмотрите на PowerCollections на CodePlex. Помимо Set и OrderedSet у него есть несколько других полезных типов коллекций, таких как Deque, MultiDictionary, Bag, OrderedBag, OrderedDictionary и OrderedMultiDictionary.
Для большего количества коллекций есть также C5 Generic Collection Library .
источник
Я знаю, что это старый поток, но я столкнулся с той же проблемой и обнаружил, что HashSet очень ненадежен, поскольку при одинаковом начальном значении GetHashCode () возвращает разные коды. Итак, я подумал, почему бы просто не использовать List и скрыть метод add следующим образом
Поскольку List использует метод Equals исключительно для определения равенства, вы можете определить метод Equals для вашего типа T, чтобы убедиться, что вы получите желаемые результаты.
источник
List.Contains
вO(n)
сложности, которая означает, что вашAdd
метод теперь также становитсяO(n)
сложным. Предполагая, что внутренняя коллекция не должна быть изменена,Add
для обоихList
иHashMap
должна иметьO(1)
сложность. TLDR: это сработает, но это хакерское и менее эффективное.