Een verzamelingsklasse selecteren
Zorg ervoor dat u uw verzamelingsklasse zorgvuldig kiest. Als u het verkeerde type gebruikt, kunt u het gebruik van de verzameling beperken.
Belangrijk
Vermijd het gebruik van de typen in de System.Collections naamruimte. De algemene en gelijktijdige versies van de verzamelingen worden aanbevolen vanwege hun grotere typeveiligheid en andere verbeteringen.
Denk na over de volgende vragen:
Hebt u een sequentiële lijst nodig waarbij het element doorgaans wordt verwijderd nadat de waarde ervan is opgehaald?
Zo ja, overweeg dan om de Queue klasse of de Queue<T> algemene klasse te gebruiken als u FIFO-gedrag (first-in, first-out) nodig hebt. Overweeg het gebruik van de Stack klasse of de Stack<T> algemene klasse als u het gedrag van laatste in, first-out (LIFO) nodig hebt. Voor veilige toegang vanuit meerdere threads gebruikt u de gelijktijdige versies ConcurrentQueue<T> en ConcurrentStack<T>. Voor onveranderbaarheid moet u rekening houden met de onveranderbare versies ImmutableQueue<T> en ImmutableStack<T>.
Als dat niet het gaat, kunt u overwegen de andere verzamelingen te gebruiken.
Moet u toegang krijgen tot de elementen in een bepaalde volgorde, zoals FIFO, LIFO of willekeurig?
De Queue klasse, evenals de Queue<T>, ConcurrentQueue<T>en ImmutableQueue<T> algemene klassen bieden allemaal FIFO-toegang. Zie Wanneer een thread-veilige verzameling gebruiken voor meer informatie.
De Stack klasse, evenals de Stack<T>, ConcurrentStack<T>en ImmutableStack<T> algemene klassen bieden allemaal LIFO-toegang. Zie Wanneer een thread-veilige verzameling gebruiken voor meer informatie.
De LinkedList<T> algemene klasse staat sequentiële toegang toe van de kop naar de staart of van de staart naar het hoofd.
Moet u elk element per index openen?
De ArrayList en StringCollection klassen en de List<T> algemene klasse bieden toegang tot hun elementen door de op nul gebaseerde index van het element. Voor onveranderbaarheid moet u rekening houden met de onveranderbare algemene versies ImmutableArray<T> en ImmutableList<T>.
De Hashtable, SortedList, en ListDictionaryStringDictionary klassen en de Dictionary<TKey,TValue> en SortedDictionary<TKey,TValue> algemene klassen bieden toegang tot hun elementen door de sleutel van het element. Daarnaast zijn er onveranderbare versies van verschillende bijbehorende typen: ImmutableHashSet<T>, ImmutableDictionary<TKey,TValue>, ImmutableSortedSet<T>en ImmutableSortedDictionary<TKey,TValue>.
De NameObjectCollectionBase en NameValueCollection klassen en de KeyedCollection<TKey,TItem> algemene SortedList<TKey,TValue> klassen bieden toegang tot hun elementen door de op nul gebaseerde index of de sleutel van het element.
Bevat elk element één waarde, een combinatie van één sleutel en één waarde, of een combinatie van één sleutel en meerdere waarden?
Eén waarde: gebruik een van de verzamelingen op basis van de IList interface of de IList<T> algemene interface. Voor een onveranderbare optie kunt u de IImmutableList<T> algemene interface overwegen.
Eén sleutel en één waarde: gebruik een van de verzamelingen op basis van de IDictionary interface of de IDictionary<TKey,TValue> algemene interface. Voor een onveranderbare optie kunt u de IImmutableSet<T> of IImmutableDictionary<TKey,TValue> algemene interfaces overwegen.
Eén waarde met ingesloten sleutel: gebruik de KeyedCollection<TKey,TItem> algemene klasse.
Eén sleutel en meerdere waarden: gebruik de NameValueCollection klasse.
Moet u de elementen anders sorteren dan de manier waarop ze zijn ingevoerd?
De Hashtable klasse sorteert de elementen op basis van hun hash-codes.
De SortedList klasse en de SortedList<TKey,TValue> en SortedDictionary<TKey,TValue> algemene klassen sorteren hun elementen op de sleutel. De sorteervolgorde is gebaseerd op de implementatie van de IComparer interface voor de SortedList klasse en op de implementatie van de IComparer<T> algemene interface voor de SortedList<TKey,TValue> en SortedDictionary<TKey,TValue> algemene klassen. Van de twee algemene typen biedt SortedDictionary<TKey,TValue> betere prestaties dan SortedList<TKey,TValue>, terwijl SortedList<TKey,TValue> er minder geheugen wordt verbruikt.
ArrayList biedt een Sort methode die een IComparer implementatie als parameter gebruikt. De generieke tegenhanger, de List<T> algemene klasse, biedt een methode die een Sort implementatie van de IComparer<T> algemene interface als parameter accepteert.
Hebt u snelle zoekopdrachten en het ophalen van informatie nodig?
- ListDictionary is sneller dan Hashtable voor kleine verzamelingen (10 items of minder). De Dictionary<TKey,TValue> algemene klasse biedt een snellere zoekactie dan de SortedDictionary<TKey,TValue> algemene klasse. De implementatie met meerdere threads is ConcurrentDictionary<TKey,TValue>. ConcurrentBag<T> biedt snelle invoeging met meerdere threads voor niet-geordende gegevens. Zie Wanneer u een thread-veilige verzameling gebruikt voor meer informatie over beide typen met meerdere threads.
Hebt u verzamelingen nodig die alleen tekenreeksen accepteren?
StringCollection (gebaseerd op IList) en StringDictionary (op basis van IDictionary) bevinden zich in de System.Collections.Specialized naamruimte.
Daarnaast kunt u een van de algemene verzamelingsklassen in de System.Collections.Generic naamruimte gebruiken als sterk getypte tekenreeksverzamelingen door de String klasse op te geven voor hun algemene typeargumenten. U kunt bijvoorbeeld aangeven dat een variabele van het type Lijsttekenreeks<of Woordenlijsttekenreeks<>, Tekenreeks> is.
LINQ naar objecten en PLINQ
MET LINQ naar objecten kunnen ontwikkelaars LINQ-query's gebruiken voor toegang tot in-memory objecten zolang het objecttype implementeert IEnumerable of IEnumerable<T>. LINQ-query's bieden een gemeenschappelijk patroon voor toegang tot gegevens, zijn doorgaans beknopter en leesbaarder dan standaardlussen foreach
, en bieden mogelijkheden voor filteren, ordenen en groeperen. Zie LINQ naar objecten (C#) en LINQ naar objecten (Visual Basic) voor meer informatie.
PLINQ biedt een parallelle implementatie van LINQ naar objecten die snellere uitvoering van query's in veel scenario's kunnen bieden, door efficiënter gebruik te maken van computers met meerdere kernen. Zie Parallel LINQ (PLINQ) voor meer informatie.