Кто-нибудь знает, есть ли хороший эквивалент 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 следующим образом
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)
сложность. TLDR: это сработает, но это хакерское и менее эффективное.