Kiedy należy używać kolekcji ogólnych
Korzystanie z kolekcji ogólnych zapewnia automatyczną korzyść bezpieczeństwa typu bez konieczności uzyskiwania od podstawowego typu kolekcji i implementowania składowych specyficznych dla typu. Typy kolekcji ogólnych zwykle działają lepiej niż odpowiadające im typy kolekcji niegenerycznych (i lepsze niż typy pochodzące z niegenerycznych typów kolekcji bazowych), gdy elementy kolekcji są typami wartości, ponieważ w przypadku typów ogólnych nie ma potrzeby tworzenia pól.
W przypadku programów przeznaczonych dla platformy .NET Standard 1.0 lub nowszego należy użyć ogólnych klas kolekcji w System.Collections.Concurrent przestrzeni nazw, gdy wiele wątków może dodawać lub usuwać elementy z kolekcji jednocześnie. Ponadto w razie potrzeby niezmienności należy wziąć pod uwagę ogólne klasy kolekcji w System.Collections.Immutable przestrzeni nazw.
Następujące typy ogólne odpowiadają istniejącym typom kolekcji:
Dictionary<TKey,TValue>i ConcurrentDictionary<TKey,TValue> są klasami ogólnymi, które odpowiadają .Hashtable
Collection<T>jest klasą ogólną odpowiadającą .CollectionBase Collection<T> może być używana jako klasa bazowa, ale w przeciwieństwie do CollectionBaseklasy , nie jest abstrakcyjna, co znacznie ułatwia użycie.
ReadOnlyCollection<T>jest klasą ogólną odpowiadającą .ReadOnlyCollectionBase ReadOnlyCollection<T> nie jest abstrakcyjny i ma konstruktor, który ułatwia uwidocznienie istniejącej List<T> jako kolekcji tylko do odczytu.
Klasy Queue<T>ogólne , ConcurrentQueue<T>, ImmutableArray<T>ImmutableQueue<T>, SortedList<TKey,TValue>, i ImmutableSortedSet<T> odpowiadają odpowiednim niegenerym klasom o tych samych nazwach.
Dodatkowe typy
Kilka typów kolekcji ogólnych nie ma niegenerycznych odpowiedników. Te kraje to:
LinkedList<T> to lista połączona ogólnego przeznaczenia, która udostępnia operacje wstawiania i usuwania O(1).
SortedDictionary<TKey,TValue> to posortowany słownik z operacjami wstawiania i pobierania O(log
n
), co sprawia, że jest to przydatna alternatywa dla SortedList<TKey,TValue>metody .KeyedCollection<TKey,TItem> jest hybrydą między listą a słownikiem, który umożliwia przechowywanie obiektów zawierających własne klucze.
BlockingCollection<T> implementuje klasę kolekcji z funkcją ograniczenia i blokowania.
ConcurrentBag<T> Zapewnia szybkie wstawianie i usuwanie nieurządkowanych elementów.
Konstruktorzy niezmienni
Gdy chcesz korzystać z funkcji niezmienności w aplikacji, System.Collections.Immutable przestrzeń nazw oferuje ogólne typy kolekcji, których można użyć. Wszystkie niezmienne typy kolekcji oferują Builder
klasy, które mogą zoptymalizować wydajność podczas wykonywania wielu mutacji. Operacje Builder
wsadowe klasy w stanie modyfikowalnym. Po zakończeniu wszystkich mutacji wywołaj metodę ToImmutable
"freeze" wszystkich węzłów i utwórz niezmienną kolekcję ogólną, na przykład ImmutableList<T>.
Obiekt Builder
można utworzyć przez wywołanie metody niegenericznej CreateBuilder()
. Z wystąpienia można wywołać metodę Builder
ToImmutable()
. Podobnie z kolekcji Immutable*
można wywołać ToBuilder()
metodę , aby utworzyć wystąpienie konstruktora z ogólnej kolekcji niezmiennej. Poniżej przedstawiono różne Builder
typy.
- ImmutableArray<T>.Builder
- ImmutableDictionary<TKey,TValue>.Builder
- ImmutableHashSet<T>.Builder
- ImmutableList<T>.Builder
- ImmutableSortedDictionary<TKey,TValue>.Builder
- ImmutableSortedSet<T>.Builder
LINQ do obiektów
Funkcja LINQ to Objects umożliwia używanie zapytań LINQ do uzyskiwania dostępu do obiektów w pamięci, o ile typ obiektu implementuje System.Collections.IEnumerable interfejs lub System.Collections.Generic.IEnumerable<T> . Zapytania LINQ zapewniają wspólny wzorzec uzyskiwania dostępu do danych; są zwykle bardziej zwięzłe i czytelne niż foreach
standardowe pętle, a także zapewniają możliwości filtrowania, porządkowania i grupowania. Zapytania LINQ mogą również zwiększyć wydajność. Aby uzyskać więcej informacji, zobacz LINQ to Objects (C#), LINQ to Objects (Visual Basic) i Parallel LINQ (PLINQ).
Dodatkowe funkcje
Niektóre typy ogólne mają funkcje, których nie można znaleźć w typach kolekcji niegenerycznych. Na przykład List<T> klasa, która odpowiada klasie niegenericznej ArrayList , ma wiele metod, które akceptują delegaty ogólne, takie jak Predicate<T> delegat, który umożliwia określenie metod wyszukiwania listy, Action<T> delegata reprezentującego metody, które działają na każdym elemenie listy, oraz Converter<TInput,TOutput> delegat, który umożliwia definiowanie konwersji między typami.
Klasa List<T> umożliwia określenie własnych IComparer<T> implementacji interfejsu ogólnego na potrzeby sortowania i przeszukiwania listy. Klasy SortedDictionary<TKey,TValue> i SortedList<TKey,TValue> mają również tę możliwość. Ponadto te klasy umożliwiają określenie porównań podczas tworzenia kolekcji. W podobny sposób Dictionary<TKey,TValue> klasy i KeyedCollection<TKey,TItem> umożliwiają określenie własnych porównań równości.