Selezione di una classe Collection
Assicurarsi di scegliere con attenzione la classe Collection, poiché l'uso del tipo errato può limitare l'uso della raccolta.
Importante
Evitare l'uso dei tipi nello spazio dei nomi System.Collections. È consigliabile usare le versioni generiche e simultanee delle raccolte per via di una maggiore indipendenza dai tipi e di altri miglioramenti.
Prendere in considerazione le domande seguenti:
È necessario un elenco sequenziale quando l'elemento viene in genere eliminato dopo che il valore è stato recuperato?
Se la risposta è affermativa ed è necessario un comportamento FIFO (First In First Out), considerare l'uso della classe Queue o della classe generica Queue<T>. Se è necessario un comportamento LIFO (Last In First Out), considerare l'uso della classe Stack o della classe generica Stack<T>. Per un accesso sicuro da più thread, usare le versioni simultanee ConcurrentQueue<T> e ConcurrentStack<T>. Per l'immutabilità, considerare le versioni non modificabili ImmutableQueue<T> e ImmutableStack<T>.
Se la risposta è negativa, è opportuno usare le altre raccolte.
È necessario accedere agli elementi in un determinato ordine, ad esempio FIFO, LIFO o casuale?
La classe Queue, nonché le classi generiche Queue<T>, ConcurrentQueue<T> e ImmutableQueue<T> offrono l'accesso FIFO. Per altre informazioni, vedere When to Use a Thread-Safe Collection (Quando usare una raccolta thread-safe).
La classe Stack, nonché le classi generiche Stack<T>, ConcurrentStack<T> e ImmutableStack<T> offrono l'accesso LIFO. Per altre informazioni, vedere When to Use a Thread-Safe Collection (Quando usare una raccolta thread-safe).
La classe generica LinkedList<T> consente l'accesso sequenziale dall'inizio alla fine o viceversa.
È necessario accedere a ciascun elemento tramite l'indice?
Le classi ArrayList e StringCollection e la classe generica List<T> consentono l'accesso ai relativi elementi tramite l'indice in base zero dell'elemento. Per l'immutabilità, prendere in considerazione le versioni non modificabili generiche ImmutableArray<T> e ImmutableList<T>.
Le classi Hashtable, SortedList, ListDictionary e StringDictionary e le classi generiche Dictionary<TKey,TValue> e SortedDictionary<TKey,TValue> consentono l'accesso ai relativi elementi tramite la chiave dell'elemento. Sono inoltre disponibili versioni non modificabili di diversi tipi corrispondenti: ImmutableHashSet<T>, ImmutableDictionary<TKey,TValue>, ImmutableSortedSet<T> e ImmutableSortedDictionary<TKey,TValue>.
Le classi NameObjectCollectionBase e NameValueCollection e le classi generiche KeyedCollection<TKey,TItem> e SortedList<TKey,TValue> consentono l'accesso ai relativi elementi tramite l'indice in base zero o la chiave dell'elemento.
Ogni elemento contiene un valore, una combinazione di una chiave e un valore o una combinazione di una chiave e più valori?
Un valore: usare una qualsiasi raccolta basata sull'interfaccia IList o sull'interfaccia generica IList<T>. Per un'opzione non modificabile, prendere in considerazione l'interfaccia generica IImmutableList<T>.
Una chiave e un valore: usare una qualsiasi raccolta basata sull'interfaccia IDictionary o sull'interfaccia generica IDictionary<TKey,TValue>. Per un'opzione non modificabile, prendere in considerazione le interfacce generiche IImmutableSet<T> o IImmutableDictionary<TKey,TValue>.
Un valore con chiave incorporata: usare la classe generica KeyedCollection<TKey,TItem>.
Una chiave e più valori: usare la classe NameValueCollection.
È necessario ordinare gli elementi in modo diverso da come sono stati immessi?
Gli elementi della classe Hashtable vengono ordinati in base ai rispettivi codici hash.
La classe SortedList e le classi generiche SortedList<TKey,TValue> e SortedDictionary<TKey,TValue> ordinano i relativi elementi in base alla chiave. L'ordinamento è basato sull'implementazione dell'interfaccia IComparer per la classe SortedList e sull'implementazione dell'interfaccia generica IComparer<T> per le classi generiche SortedList<TKey,TValue> e SortedDictionary<TKey,TValue>. Dei due tipi generici, SortedDictionary<TKey,TValue> offre prestazioni migliori di SortedList<TKey,TValue>, mentre SortedList<TKey,TValue> utilizza meno memoria.
ArrayList fornisce un metodo Sort che accetta come parametro un'implementazione di IComparer. La relativa controparte generica, ossia la classe List<T>, fornisce un metodo Sort che accetta come parametro un'implementazione dell'interfaccia generica IComparer<T>.
Sono necessarie le ricerche veloci e il recupero di informazioni?
- ListDictionary è più veloce di Hashtable per le raccolte che non superano le 10 voci. La classe generica Dictionary<TKey,TValue> consente ricerche più veloci rispetto alla classe generica SortedDictionary<TKey,TValue>. L'implementazione multithreading è ConcurrentDictionary<TKey,TValue>. ConcurrentBag<T> fornisce un inserimento multithreading veloce per i dati non ordinati. Per altre informazioni su entrambi i tipi di multithread, vedere Quando usare una raccolta thread-safe.
Sono necessarie raccolte che accettano solo stringhe?
La classe StringCollection (basata su IList) e la classe StringDictionary (basata su IDictionary) sono incluse nello spazio dei nomi System.Collections.Specialized.
È anche possibile usare una qualsiasi classe di raccolte generiche nello spazio dei nomi System.Collections.Generic come raccolte di stringhe fortemente tipizzate specificando la classe String per i relativi argomenti di tipo generico. Ad esempio, è possibile dichiarare una variabile di tipo List<String> o Dictionary<String,String>.
LINQ to Objects e PLINQ
LINQ to Objects permette agli sviluppatori di usare le query LINQ per accedere agli oggetti in memoria, a condizione che il tipo dell'oggetto implementi IEnumerable o IEnumerable<T>. Le query LINQ forniscono un modello comune per l'accesso ai dati, sono in genere più concise e leggibili dei cicli foreach
standard e forniscono funzionalità di filtro, ordinamento e raggruppamento. Per altre informazioni, vedere LINQ to Objects (C#) e LINQ to Objects (Visual Basic).
PLINQ fornisce un'implementazione parallela di LINQ to Objects in grado di offrire un'esecuzione più rapida delle query in molti scenari, grazie a un uso più efficiente dei computer multicore. Per altre informazioni, vedere Parallel LINQ (PLINQ).