Il Framework .NET definisce le classi per le collections all’interno di System.Collections e, per i generics all’interno di System.Collections.Generics. L’introduzione delle collections generiche è avvenuta a partire dalla release 2.0 del framework .NET e con il rilascio di C# 2.0.

L’interfaccia base da cui partire è IEnumerable<T> che consente di effettuare l’iterazione sugli elementi, ad esempio utilizzando il metodo foreach.
L’interfaccia ICollection<T> eredita da IEnumerable<T> e ne aggiunge i metodi per effettuare il Count degli elementi e per modificarli: Add<T>, Remove<T>, Clear() .
Attraverso queste due interfacce è possibile implementare una semplice collection di elementi, ma il framework mette a disposizione alcune interfacce, che ereditano sempre da IEnumerable<T> ma aggiungendone funzionalità specifiche: IList<T>, ISet<T>, IDictionary<TKey, TValue>.
IList<T>
L’interfaccia IList<T> aggiunge alle collections la possibilità di essere indicizzate, introducendo di fatto l’accesso ai singoli elementi tramite il loro indice. Viene quindi aggiunto un indice che consente di impostare / ottenere ogni singolo valore. Vengono anche aggiunti i metodi Insert(…) e RemoveAt(…) rispettivamente per inserire e rimuovere elementi.
La naturale implementazione di questa interfaccia è la classe List<T>.
ISet<T>
L’interfaccia ISet<T> definisce una collection come un sineme di elementi univoci senza fornire alcuna garanzia sul mantenimento dell’ordinamento. Per poter inserire elementi all’interno della collections è possibile utilizzare il metodo Add(…) che aggiunge l’elemento SOLTANTO se non già presente. Il valore ritornato dal metodo Add consente di determinare se l’elemento è stato inserito oppure no. Considerando la natura di tipo insiemistico per questo tipo di collections sono presenti anche i metodi UnionWith(…), IntersectWith(…), ExceptWith(…) e SymmetricExceptWith(…).
La naturale implementazione di questa interfaccia è la classe HashSet<T>.
IDictionary<TKey, TValue>
Questa particolare interfaccia, a differenza delle precedenti, consente la memorizzazione di elementi del tipo chiave-valore. Il valore della chiave consente di ottenere il valore associato. E’ presente un metodo Add(…) che accetta in ingresso due parametri: la chiave e il relativo valore. Sono anche presenti metodi che consentono di verificare se una chiave è presente o meno all’interno della collection e per rimuovere un elemento ricercato per la sua chiave: ContainsKey(…) e Remove(…).
La naturale implementazione di questa interfaccia è la classe Dictionary<TKey, TValue>.
Nel caso si renda necessario memorizzare le chiavi in maniera ordinata, esistono due specifiche implementazioni: SortedDictionary<TKey, TValue> e SortedList<TKey,TValue>.