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