Czy ktoś wie, czy istnieje dobry odpowiednik Set
kolekcji Java w C #? Wiem, że można nieco naśladować zestaw za pomocą a Dictionary
lub a HashTable
, wypełniając, ale ignorując wartości, ale to nie jest zbyt elegancki sposób.
Czy ktoś wie, czy istnieje dobry odpowiednik Set
kolekcji Java w C #? Wiem, że można nieco naśladować zestaw za pomocą a Dictionary
lub a HashTable
, wypełniając, ale ignorując wartości, ale to nie jest zbyt elegancki sposób.
Odpowiedzi:
Wypróbuj HashSet :
Klasa HashSet (Of T) zapewnia operacje zestawu o wysokiej wydajności. Zestaw to kolekcja, która nie zawiera zduplikowanych elementów, a której elementy nie mają określonej kolejności ...
Pojemność obiektu HashSet (Of T) to liczba elementów, które obiekt może pomieścić. Pojemność obiektu HashSet (Of T) automatycznie wzrasta, gdy elementy są dodawane do obiektu.
Klasa HashSet (Of T) jest oparta na modelu zbiorów matematycznych i zapewnia wysokowydajne operacje na zestawach podobne do uzyskiwania dostępu do kluczy kolekcji Dictionary (Of TKey, TValue) lub Hashtable . Mówiąc prościej, klasę HashSet (Of T) można uznać za kolekcję Dictionary (Of TKey, TValue) bez wartości.
Kolekcja HashSet (Of T) nie jest sortowana i nie może zawierać zduplikowanych elementów ...
Jeśli korzystasz z .NET 3.5, możesz użyć HashSet<T>
. To prawda, że .NET nie obsługuje zestawów tak dobrze jak Java.
W PowerCollections Wintellect może pomóc też.
Jeśli używasz platformy .NET 4.0 lub nowszej:
W razie potrzeby sortowania użyj SortedSet<T>
. W przeciwnym razie, jeśli nie, użyj, HashSet<T>
ponieważ służy O(1)
do wyszukiwania i manipulowania operacjami. Natomiast SortedSet<T>
służy O(log n)
do wyszukiwania i manipulowania operacjami.
Korzystam z Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx
Jest używany w wielu projektach OSS, po raz pierwszy zetknąłem się z nim w NHibernate
Używam otoki wokół Dictionary<T, object>
, przechowując wartości zerowe w wartościach. Daje to O (1) dodawanie, wyszukiwanie i usuwanie na klawiszach, a do wszystkich celów i celów działa jak zestaw.
Spójrz na PowerCollections na CodePlex. Oprócz Set i OrdersSet ma kilka innych przydatnych typów kolekcji, takich jak Deque, MultiDictionary, Bag, OrdersBag, OrdersDictionary i OrdersMultiDictionary.
Aby uzyskać więcej kolekcji, dostępna jest również ogólna biblioteka kolekcji C5 .
Wiem, że to stary wątek, ale napotkałem ten sam problem i stwierdziłem, że HashSet jest bardzo zawodny, ponieważ biorąc pod uwagę to samo ziarno, GetHashCode () zwrócił różne kody. Pomyślałem więc, dlaczego nie skorzystać z Listy i ukryć metodę dodawania w ten sposób
public class UniqueList<T> : List<T>
{
public new void Add(T obj)
{
if(!Contains(obj))
{
base.Add(obj);
}
}
}
Ponieważ List używa metody Równości wyłącznie w celu ustalenia równości, możesz zdefiniować metodę Równości w swoim typie T, aby upewnić się, że uzyskasz pożądane wyniki.
List.Contains
jest O(n)
złożoność co oznacza, że Add
metoda staje się teraz O(n)
złożoności, jak również. Zakładając kolekcję wewnętrzny nie musi być zmieniany, Add
zarówno List
i HashMap
powinny być od O(1)
złożoności. TLDR: To zadziała, ale jest hakujące i mniej wydajne.