Хтось знає, чи є гарний еквівалент 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 TKey, TValue) або Hashtable колекцій. Простіше кажучи, клас HashSet (Of T) можна розглядати як колекцію словника (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 та OrdersSet, у нього є кілька інших корисних типів колекції, такі як Deque, MultiDictionary, Bag, OrdersBag, OrрадDictionary та OrрадMultiDictionary.
Для більшої кількості колекцій також є загальна бібліотека колекцій C5 .
Я знаю, що це стара тема, але я зіткнувся з тією ж проблемою і виявив, що HashSet є дуже ненадійним, оскільки, даючи одне і те ж насіння, GetHashCode () повертав різні коди. Отже, я подумав, чому б просто не використати Список та приховати такий метод додавання
public class UniqueList<T> : List<T>
{
public new void Add(T obj)
{
if(!Contains(obj))
{
base.Add(obj);
}
}
}
Оскільки Список використовує метод рівних виключно для визначення рівності, ви можете визначити метод рівняння для типу Т, щоб переконатися, що ви отримаєте бажані результати.
List.Contains
це O(n)
складність, що означає, що ваш Add
метод тепер стає також O(n)
складним. Якщо припустити , що внутрішній збір не повинен бути змінений, Add
для обох List
і HashMap
повинні бути O(1)
складності. TLDR: Це буде працювати, але це хакі і менш ефективно.