Kdy použít obecné kolekce
Používání obecných kolekcí je obecně doporučeno, protože získáte okamžitý prospěch z bezpečnosti typů bez nutnosti odvozování ze základní kolekce typů a implementace typově specifických členů. Typy obecných kolekcí také obvykle poskytují lepší výkon než odpovídající typy neobecných kolekcí (a lepší než typy, které jsou odvozeny ze základních typů neobecných kolekcí), když prvky kolekce jsou typy hodnot, protože s obecnými typy není nutné zabalovat prvky.
U programů, které jsou zacíleny na .NET Framework verze 4 nebo novější, byste měli použít obecné třídy kolekcí v oboru názvů System.Collections.Concurrent, když je možné, že více vláken může přidávat nebo odebírat současně položky z kolekce.
Následující obecné typy odpovídají existujícím typům kolekcí:
Dictionary<TKey, TValue> a ConcurrentDictionary<TKey, TValue> jsou obecné třídy, které odpovídají Hashtable.
Collection<T> je obecná třída, která odpovídá CollectionBase. Collection<T> lze použít jako základní třídu, ale na rozdíl od CollectionBase, není abstraktní. Díky tomu je použití mnohem jednodušší.
ReadOnlyCollection<T> je obecná třída, která odpovídá ReadOnlyCollectionBase. ReadOnlyCollection<T> není abstraktní a má konstruktor, který usnadňuje vystavení existující List<T> jako kolekce jen pro čtení.
Obecné třídy Queue<T>, ConcurrentQueue<T>, Stack<T>, ConcurrentStack<T>a SortedList<TKey, TValue> odpovídají neobecným třídám se stejnými názvy.
Další typy
Několik typů obecných kolekcí nemá neobecné protějšky. Mezi ně patří následující:
LinkedList<T> je propojený seznam pro obecné účely, který poskytuje operace vložení a odebrání O(1).
SortedDictionary<TKey, TValue> je seřazený slovník s O(log n) operacemi vložení a načtení, které z něj tvoří užitečnou alternativu k SortedList<TKey, TValue>.
KeyedCollection<TKey, TItem> je hybridem mezi seznamem a slovníkem, který umožňuje uložení objektů, které obsahují vlastní klíče.
BlockingCollection<T> implementuje třídu kolekce s funkcí ohraničování a blokování.
ConcurrentBag<T> poskytuje rychlé vložení a odebrání neuspořádaných prvků.
LINQ to Objects
Funkce LINQ to Objects vám umožní použít dotazy LINQ pro přístup k objektům v paměti na tak dlouho, dokud objektový typ implementuje rozhraní System.Collections.IEnumerable nebo System.Collections.Generic.IEnumerable<T>. Dotazy LINQ poskytují společný vzor pro přístupová data. Jsou obvykle více stručná a čitelná než standardní smyčky foreach a poskytují filtrování, řazení a seskupování schopností. Dotazy LINQ mohou také zvýšit výkon. Další informace naleznete v tématu LINQ to Objekty a Paralelní LINQ (PLINQ).
Další funkce
Některé obecné typy mají funkce, které nelze nalézt v neobecných typech kolekcí. Například třída List<T>, která odpovídá neobecné třídě ArrayList, disponuje řadou metod, které přijmají obecné delegáty, například delegát Predicate<T>, který umožňuje určit metody pro hledání v seznamu, delegát Action<T> představující metody, které působí na každý prvek seznamu, a delegát Converter<TInput, TOutput>, který umožňuje definovat převody mezi typy.
Třída List<T> umožňuje zadat vlastní implementace obecného rozhraní IComparer<T> pro řazení a vyhledávání v seznamu. Třídy SortedDictionary<TKey, TValue> a SortedList<TKey, TValue> mají také tuto funkci. Kromě toho tyto třídy umožňují při vytvoření kolekce určit komparátory. Podobně třídy Dictionary<TKey, TValue> a KeyedCollection<TKey, TItem> umožňují určit vlastní komparátory rovnosti.