Výběr třídy kolekce
Nezapomeňte pečlivě vybrat třídu kolekce. Použití nesprávného typu může omezit použití kolekce.
Důležité
Nepoužívejte typy v System.Collections oboru názvů. Obecné a souběžné verze kolekcí se doporučují kvůli větší bezpečnosti typů a dalším vylepšením.
Zvažte následující otázky:
Potřebujete sekvenční seznam, kde je prvek obvykle zahozen po načtení jeho hodnoty?
Pokud ano, zvažte použití Queue třídy nebo Queue<T> obecné třídy, pokud potřebujete chování fiFO (first-in), první out (FIFO). Pokud potřebujete chování typu last-in, first-out (LIFO) zvažte použití Stack třídy nebo Stack<T> obecné třídy. Pro bezpečný přístup z více vláken použijte souběžné verze ConcurrentQueue<T> a ConcurrentStack<T>. Pro neměnnost zvažte neměnné verze ImmutableQueue<T> a ImmutableStack<T>.
Pokud ne, zvažte použití ostatních kolekcí.
Potřebujete získat přístup k prvkům v určitém pořadí, jako je FIFO, LIFO nebo náhodné?
Třída Queue , stejně Queue<T>jako , ConcurrentQueue<T>a ImmutableQueue<T> obecné třídy všechny nabízejí PŘÍSTUP FIFO. Další informace naleznete v tématu Kdy použít kolekci Sejf vláken.
Třída Stack , stejně Stack<T>jako , ConcurrentStack<T>a ImmutableStack<T> obecné třídy všechny nabízejí PŘÍSTUP LIFO. Další informace naleznete v tématu Kdy použít kolekci Sejf vláken.
Obecná LinkedList<T> třída umožňuje sekvenční přístup buď z hlavy na ocas, nebo z ocasu do hlavy.
Potřebujete získat přístup ke každému prvku podle indexu?
Třídy ArrayList a StringCollectionList<T> obecná třída nabízejí přístup k jejich prvkům pomocí indexu založeného na nule prvku. Pro neměnnost zvažte neměnné obecné verze ImmutableArray<T> a ImmutableList<T>.
Třídy Hashtable, , ListDictionarySortedLista StringDictionary třídy a Dictionary<TKey,TValue> obecné SortedDictionary<TKey,TValue> třídy nabízejí přístup k jejich prvkům klíčem prvku. Kromě toho existují neměnné verze několika odpovídajících typů: ImmutableHashSet<T>, ImmutableDictionary<TKey,TValue>, ImmutableSortedSet<T>a ImmutableSortedDictionary<TKey,TValue>.
Třídy NameObjectCollectionBase a NameValueCollectionKeyedCollection<TKey,TItem>SortedList<TKey,TValue> obecné třídy nabízejí přístup k jejich prvkům buď indexem založeným na nule, nebo klíčem prvku.
Bude každý prvek obsahovat jednu hodnotu, kombinaci jednoho klíče a jedné hodnoty nebo kombinaci jednoho klíče a více hodnot?
Jedna hodnota: Použijte některou z kolekcí na IList základě rozhraní nebo IList<T> obecného rozhraní. U neměnné možnosti zvažte IImmutableList<T> obecné rozhraní.
Jeden klíč a jedna hodnota: Použijte některou z kolekcí na IDictionary základě rozhraní nebo IDictionary<TKey,TValue> obecného rozhraní. U neměnné možnosti zvažte IImmutableSet<T> rozhraní nebo IImmutableDictionary<TKey,TValue> obecná rozhraní.
Jedna hodnota s vloženým klíčem: Použijte KeyedCollection<TKey,TItem> obecnou třídu.
Jeden klíč a více hodnot: Použijte NameValueCollection třídu.
Potřebujete prvky seřadit odlišně od toho, jak byly zadány?
Třída Hashtable seřadí své prvky podle svých kódů hash.
Třída SortedList a SortedList<TKey,TValue>SortedDictionary<TKey,TValue> obecné třídy seřadí jejich prvky podle klíče. Pořadí řazení je založeno na implementaci IComparer rozhraní pro SortedList třídu a na implementaci IComparer<T> obecného rozhraní pro SortedList<TKey,TValue> třídy a SortedDictionary<TKey,TValue> obecné třídy. Ze dvou obecných typů SortedDictionary<TKey,TValue> nabízí lepší výkon než SortedList<TKey,TValue>, zatímco SortedList<TKey,TValue> spotřebovává méně paměti.
ArrayList poskytuje metodu Sort , která přebírá implementaci IComparer jako parametr. Její obecný protějšek, List<T> obecná třída, poskytuje metodu Sort , která přebírá implementaci IComparer<T> obecného rozhraní jako parametr.
Potřebujete rychlé vyhledávání a načítání informací?
- ListDictionary je rychlejší než Hashtable u malých kolekcí (10 položek nebo méně). Obecná Dictionary<TKey,TValue> třída poskytuje rychlejší vyhledávání než SortedDictionary<TKey,TValue> obecná třída. Implementace s více vlákny je ConcurrentDictionary<TKey,TValue>. ConcurrentBag<T> poskytuje rychlé vložení s více vlákny pro neuspořádaná data. Další informace o obou typech s více vlákny naleznete v tématu Kdy použít thread-Sejf kolekce.
Potřebujete kolekce, které přijímají pouze řetězce?
StringCollection (na IListzákladě ) a StringDictionary (na IDictionaryzákladě) jsou v System.Collections.Specialized oboru názvů.
Kromě toho můžete použít libovolnou z obecných tříd kolekce v System.Collections.Generic oboru názvů jako kolekce řetězců silného typu zadáním String třídy pro jejich argumenty obecného typu. Můžete například deklarovat proměnnou typu List<String nebo Dictionary<String,String>>.
LINQ to – objekty a PLINQ
LINQ to Objects umožňuje vývojářům používat dotazy LINQ pro přístup k objektům v paměti, pokud typ objektu implementuje IEnumerable nebo IEnumerable<T>. Dotazy LINQ poskytují běžný vzor pro přístup k datům, obvykle jsou stručnější a čitelnější než standardní foreach
smyčky a poskytují možnosti filtrování, řazení a seskupování. Další informace najdete v tématu LINQ to Objects (C#) a LINQ to Objects (Visual Basic).
PLINQ poskytuje paralelní implementaci LINQ to Objects, která nabízí rychlejší spouštění dotazů v mnoha scénářích prostřednictvím efektivnějšího používání vícejádrových počítačů. Další informace naleznete v tématu Paralelní LINQ (PLINQ).