Välja en samlingsklass
Var noga med att välja din samlingsklass. Om du använder fel typ kan du begränsa användningen av samlingen.
Viktigt!
Undvik att använda typerna System.Collections i namnområdet. De generiska och samtidiga versionerna av samlingarna rekommenderas på grund av deras större typsäkerhet och andra förbättringar.
Överväg följande frågor:
Behöver du en sekventiell lista där elementet vanligtvis ignoreras när dess värde har hämtats?
Om ja kan du överväga att använda Queue klassen eller den Queue<T> generiska klassen om du behöver FIFO-beteende (first-in, first-out). Överväg att Stack använda klassen eller den Stack<T> generiska klassen om du behöver liFO-beteende (last-in, first-out). För säker åtkomst från flera trådar använder du de samtidiga versionerna ConcurrentQueue<T> och ConcurrentStack<T>. För oföränderlighet bör du överväga de oföränderliga versionerna ImmutableQueue<T> och ImmutableStack<T>.
Om inte kan du överväga att använda de andra samlingarna.
Behöver du komma åt elementen i en viss ordning, till exempel FIFO, LIFO eller slumpmässigt?
Klassen Queue , samt klasserna Queue<T>, ConcurrentQueue<T>, och ImmutableQueue<T> generic erbjuder fifo-åtkomst. Mer information finns i När du ska använda en tråd-Valv-samling.
Klassen Stack , liksom klasserna Stack<T>, ConcurrentStack<T>, och ImmutableStack<T> generic erbjuder lifo-åtkomst. Mer information finns i När du ska använda en tråd-Valv-samling.
Den LinkedList<T> generiska klassen tillåter sekventiell åtkomst från huvudet till svansen eller från svansen till huvudet.
Behöver du komma åt varje element efter index?
Klasserna ArrayList och StringCollection och den List<T> generiska klassen ger åtkomst till sina element med elementets nollbaserade index. För oföränderlighet bör du överväga de oföränderliga generiska versionerna ImmutableArray<T> och ImmutableList<T>.
Klasserna Hashtable, SortedList, ListDictionary, och StringDictionary och de SortedDictionary<TKey,TValue>Dictionary<TKey,TValue> generiska klasserna ger åtkomst till deras element med nyckeln för elementet. Dessutom finns det oföränderliga versioner av flera motsvarande typer: ImmutableHashSet<T>, ImmutableDictionary<TKey,TValue>, ImmutableSortedSet<T>och ImmutableSortedDictionary<TKey,TValue>.
Klasserna NameObjectCollectionBase och NameValueCollection och de KeyedCollection<TKey,TItem>SortedList<TKey,TValue> generiska klasserna ger åtkomst till sina element genom antingen det nollbaserade indexet eller nyckeln för elementet.
Kommer varje element att innehålla ett värde, en kombination av en nyckel och ett värde, eller en kombination av en nyckel och flera värden?
Ett värde: Använd någon av samlingarna baserat på IList gränssnittet eller det IList<T> allmänna gränssnittet. Om du vill ha ett oföränderligt alternativ bör du överväga det IImmutableList<T> allmänna gränssnittet.
En nyckel och ett värde: Använd någon av samlingarna baserat på IDictionary gränssnittet eller det IDictionary<TKey,TValue> allmänna gränssnittet. Om du vill ha ett oföränderligt alternativ bör du överväga eller IImmutableSet<T>IImmutableDictionary<TKey,TValue> använda allmänna gränssnitt.
Ett värde med inbäddad nyckel: Använd den KeyedCollection<TKey,TItem> generiska klassen.
En nyckel och flera värden: Använd NameValueCollection klassen.
Behöver du sortera elementen på ett annat sätt än hur de angavs?
Klassen Hashtable sorterar sina element efter sina hashkoder.
Klassen SortedList och de SortedList<TKey,TValue> generiska SortedDictionary<TKey,TValue> klasserna sorterar sina element efter nyckeln. Sorteringsordningen baseras på implementeringen av IComparer gränssnittet för SortedList klassen och på implementeringen av det IComparer<T> generiska gränssnittet för de SortedList<TKey,TValue> och SortedDictionary<TKey,TValue> generiska klasserna. Av de två generiska typerna SortedDictionary<TKey,TValue> ger bättre prestanda än SortedList<TKey,TValue>, medan SortedList<TKey,TValue> förbrukar mindre minne.
ArrayList tillhandahåller en Sort metod som tar en IComparer implementering som en parameter. Dess generiska motsvarighet, den List<T> generiska klassen, tillhandahåller en Sort metod som använder en implementering av det IComparer<T> generiska gränssnittet som en parameter.
Behöver du snabba sökningar och hämtning av information?
- ListDictionary är snabbare än Hashtable för små samlingar (10 objekt eller färre). Den Dictionary<TKey,TValue> generiska klassen ger snabbare sökning än den SortedDictionary<TKey,TValue> generiska klassen. Den flertrådade implementeringen är ConcurrentDictionary<TKey,TValue>. ConcurrentBag<T> ger snabb infogning med flera trådar för osorterade data. Mer information om båda typerna med flera trådar finns i När du ska använda en tråd-Valv-samling.
Behöver du samlingar som endast accepterar strängar?
StringCollection (baserat på IList) och StringDictionary (baserat på IDictionary) finns i System.Collections.Specialized namnområdet.
Dessutom kan du använda någon av de generiska samlingsklasserna i System.Collections.Generic namnområdet som starkt skrivna strängsamlingar genom att String ange klassen för deras allmänna typargument. Du kan till exempel deklarera att en variabel är av typen Liststräng<> eller Ordlistesträng,Sträng><.
LINQ till objekt och PLINQ
LINQ till objekt gör det möjligt för utvecklare att använda LINQ-frågor för att komma åt minnesinterna objekt så länge objekttypen implementerar IEnumerable eller IEnumerable<T>. LINQ-frågor ger ett vanligt mönster för åtkomst till data, är vanligtvis mer koncisa och läsbara än standardloopar foreach
och tillhandahåller funktioner för filtrering, ordning och gruppering. Mer information finns i LINQ to Objects (C#) and LINQ to Objects (Visual Basic).
PLINQ tillhandahåller en parallell implementering av LINQ till objekt som kan erbjuda snabbare frågekörning i många scenarier, genom effektivare användning av datorer med flera kärnor. Mer information finns i Parallell LINQ (PLINQ).