Quando utilizzare insiemi generici
L'utilizzo di insiemi generici è in genere consigliato poiché offre l'immediato vantaggio dell'indipendenza dai tipi, senza la necessità di derivare da un tipo di insieme base e implementare membri specifici di tipo. I tipi di insiemi generici offrono inoltre prestazioni migliori dei tipi non generici corrispondenti (e dei tipi derivati dai tipi di insiemi base non generici) quando gli elementi di un insieme sono tipi di valore, poiché i generics non richiedono il boxing degli elementi.
Per programmi destinati a .NET Framework versione 4 o versione successiva, è necessario utilizzare classi di insiemi generiche nello spazio dei nomi System.Collections.Concurrent quando potrebbe verificarsi che più thread aggiungano o rimuovano elementi dall'insieme contemporaneamente.
I tipi generici riportati di seguito corrispondono a tipi di insiemi esistenti:
Dictionary<TKey, TValue> e ConcurrentDictionary<TKey, TValue> sono le classi generiche che corrispondono a Hashtable.
Collection<T> è la classe generica che corrisponde a CollectionBase. È possibile utilizzare Collection<T> come classe di base, ma a differenza di CollectionBase non si tratta di una classe astratta. ed è pertanto più facile da utilizzare.
ReadOnlyCollection<T> è la classe generica che corrisponde a ReadOnlyCollectionBase. La classe ReadOnlyCollection<T> non è una classe astratta e dispone di un costruttore che semplifica l'esposizione di un oggetto List<T> esistente come insieme di sola lettura.
Le classi generiche Queue<T>, ConcurrentQueue<T>, Stack<T>, ConcurrentStack<T> e SortedList<TKey, TValue> corrispondono alle rispettive classi non generiche con gli stessi nomi.
Tipi aggiuntivi
Per diversi tipi di insiemi generici non sono disponibili tipi non generici corrispondenti. tra cui:
LinkedList<T> è un elenco collegato di utilizzo generale che consente operazioni di inserimento e rimozione basate su O(1).
SortedDictionary<TKey, TValue> è un dizionario ordinato con operazioni di inserimento e recupero basate su O(log n) e rappresenta una valida alternativa a SortedList<TKey, TValue>.
KeyedCollection<TKey, TItem> è un ibrido tra un elenco e un dizionario che offre un sistema per l'archiviazione di oggetti che contengono le relative chiavi.
BlockingCollection<T> implementa una classe Collection con funzionalità di delimitazione e blocco.
ConcurrentBag<T> fornisce un inserimento veloce e la rimozione degli elementi non ordinati.
LINQ to Objects
La funzionalità LINQ to Objects consente di utilizzare le query LINQ per accedere agli oggetti in memoria purché il tipo dell'oggetto implementi l'interfaccia System.Collections.IEnumerable o System.Collections.Generic.IEnumerable<T>. Le query LINQ forniscono un modello comune per l'accesso ai dati, sono in genere più concise e leggibili dei cicli standard foreach e forniscono funzioni di filtro, ordinamento e raggruppamento. Le query LINQ possono inoltre migliorare le prestazioni. Per ulteriori informazioni, vedere LINQ to Objects e Parallel LINQ (PLINQ).
Funzionalità aggiuntive
Alcuni tipi generici dispongono di funzionalità che non sono presenti nei tipi di insiemi non generici. La classe List<T>, ad esempio, che corrisponde alla classe ArrayList non generica, dispone di un certo numero di metodi che accettano delegati generici, ad esempio il delegato Predicate<T>, che consente di specificare metodi per la ricerca nell'elenco, il delegato Action<T>, che rappresenta i metodi applicabili a ciascun elemento dell'elenco, e il delegato Converter<TInput, TOutput>, che consente di definire le conversioni tra tipi.
La classe List<T> consente di specificare implementazioni di interfacce generiche IComparer<T> personalizzate per l'ordinamento e la ricerca nell'elenco. Anche le classi SortedDictionary<TKey, TValue> e SortedList<TKey, TValue> dispongono di questa funzionalità. Inoltre, queste classi consentono di specificare gli operatori di confronto quando viene creato l'insieme. Analogamente, le classi Dictionary<TKey, TValue> e KeyedCollection<TKey, TItem> consentono di specificare operatori di confronto uguaglianze personalizzati.