Výběr třídy kolekce
Je třeba pečlivě zvolit třídy kolekce. Použití nesprávného typu může omezit použití kolekce. Obecně nepoužívejte typy v oboru názvů System.Collections pokud výslovně nevolíte rozhraní .NET Framework verze 1.1. Obecné a souběžné verze kolekcí jsou upřednostňovány z důvodu jejich větší bezpečnosti typů a jiných vylepšení.
Zvažte následující otázky:
Potřebujete sekvenční seznam tam, kde je element obvykle odstraněn po načtení jeho hodnoty?
Pokud ano, zvažte použití třídy Queue nebo obecné třídy Queue<T>, pokud potřebujete chování první dovnitř, první ven (fronta FIFO). Zvažte použití třídy Stack nebo obecné třídy Stack<T>, pokud potřebujete chování poslední dovnitř, první ven (fronta LIFO). Pro bezpečný přístup z více vláken použijte souběžné verze ConcurrentQueue<T> a ConcurrentStack<T>.
Pokud tomu tak není, zvažte použití jiných kolekcích.
Potřebujete přístupovat k prvkům v určitém pořadí, jako například FIFO, LIFO, nebo náhodně?
Třída Queue a Queue<T> nebo obecná třída ConcurrentQueue<T> nabízí přístup FIFO. Další informace naleznete v tématu Kdy použít kolekce pro bezpečný přístup z více vláken.
Třída Stack a Stack<T> nebo obecná třída ConcurrentStack<T> nabízí přístup LIFO. Další informace naleznete v tématu Kdy použít kolekce pro bezpečný přístup z více vláken.
Obecná třída LinkedList<T> umožňuje sekvenční přístup od začátku na konec nebo od konce směrem na začátek.
Potřebujete přistupovat ke každému elementu podle indexu?
Třídy ArrayList and StringCollection a obecná třídaList<T> nabízí přístup k jejich elementům pomocí indexu jejich elementů, které začínají od nuly.
Třídy Hashtable, SortedList, ListDictionary, a StringDictionary a obecné třídy Dictionary<TKey, TValue> a SortedDictionary<TKey, TValue> nabízejí přístup k jejich prvkům na základě klíče prvku.
Třídy NameObjectCollectionBase a NameValueCollection a obecné třídy KeyedCollection<TKey, TItem> a SortedList<TKey, TValue> nabízí přístup k jejich elementům pomocí indexu vycházejícího z nuly nebo pomocí klíče elementu.
Bude každý element obsahovat jednu hodnota, kombinaci klíče a jedné hodnoty, nebo kombinací jednoho klíče a více hodnot?
Jedna hodnota: Použijte některou z kolekce, na základě rozhraní IList nebo obeného rozhraní IList<T>.
Jeden klíč a jedna hodnota: Použijte některou z kolekce, na základě rozhraní IDictionary nebo obeného rozhraní IDictionary<TKey, TValue>.
Jedna hodnota s vloženým klíčem: Použijte obecnou třídu KeyedCollection<TKey, TItem>.
Jeden klíč a více hodnot: Použijte třídu NameValueCollection.
Je třeba seřadit prvky jinak, než jak byly zadány?
Třída Hashtable seřadí její prvky podle jejich hash hodnot.
Třída SortedList a obecné třídy SortedDictionary<TKey, TValue> a SortedList<TKey, TValue> řadit jejich elementy podle klíče na základě implementace rozhraní IComparer a obecného rozhraní IComparer<T>.
ArrayList poskytuje metodu Sort, která přebírá implementaci IComparer jako parametr. Jeho obecný protějšek, obecná třída List<T> poskytuje metodu Sort, která přebírá implementaci obecného rozhraní IComparer<T> jako parametr.
Je potřeba rychle vyhledávat a načítat informace?
- ListDictionary je rychlejší než Hashtable pro kolekce malé (10 položek nebo méně). Obecná třída Dictionary<TKey, TValue> poskytuje rychlejší vyhledávání než obecná třída SortedDictionary<TKey, TValue>. Vícevláknová implementace je ConcurrentDictionary<TKey, TValue>. ConcurrentBag<T> poskytuje rychlé vícevláknové vkládání pro neuspořádaná data. Další informace o obou vícevláknových typech naleznete v tématu Kdy použít kolekce pro bezpečný přístup z více vláken.
Je potřeba mít kolekce, které přijímají pouze řetězce?
StringCollection (na základě IList) a StringDictionary (na základě IDictionary) jsou v oboru názvů System.Collections.Specialized.
Kromě toho lze použít jakékoli obecné třídy kolekcí v oboru názvů System.Collections.Generic jako kolekce řetězců silného typu zadáním třídy String pro jejich argumenty obecného typu.
LINQ to Objects a PLINQ
LINQ to Objects umožní vývojářům použít dotazy LINQ pro přístup k objektům v paměti na tak dlouho, dokud objektový typ implementuje IEnumerable nebo IEnumerable<T>. Dotazy LINQ poskytují společný vzorek pro přístup k datům. Jsou obvykle více stručná a čitelná než standardní smyčky foreach a poskytují filtrování, řazení a seskupování. Další informace naleznete v tématu LINQ to Objekty.
PLINQ poskytuje paralelní implementaci LINQ to Objects, které mohou nabízet rychlejší spuštění dotazu v mnoha scénářích díkyefektivnějšímu použití vícejádrových počítačů. Další informace naleznete v tématu Paralelní LINQ (PLINQ).
Viz také
Odkaz
System.Collections.Specialized