Cuándo utilizar colecciones genéricas
En general, es recomendable utilizar colecciones genéricas porque se obtiene la ventaja inmediata de la seguridad de tipos sin necesidad de derivar de un tipo de colección base e implementar miembros específicos de los tipos. Además, por lo general los tipos de colección genéricos tienen un mejor rendimiento que los tipos de colección no genéricos correspondientes (y mejor que el de los tipos derivados de tipos de colección base no genéricos) cuando los elementos de la colección son tipos de valor, porque con los genéricos no hay necesidad de realizar conversiones boxing de los elementos.
En el caso de los programas destinados a .NET Framework versión 4 o posterior, debe usar las clases de colección genéricas en el espacio de nombres System.Collections.Concurrent cuando varios subprocesos puedan agregar o quitar elementos de la colección simultáneamente.
Los siguientes tipos genéricos corresponden a los tipos de colección existentes:
List<T> es la clase genérica que se corresponde con ArrayList.
Dictionary<TKey, TValue> y ConcurrentDictionary<TKey, TValue> son las clases genéricas que se corresponden con Hashtable.
Collection<T> es la clase genérica que se corresponde con CollectionBase. Collection<T> se puede usar como clase base pero, a diferencia de CollectionBase, no es abstracta. Esto facilita mucho su uso.
ReadOnlyCollection<T> es la clase genérica correspondiente a ReadOnlyCollectionBase. ReadOnlyCollection<T> es no abstracta y tiene un constructor que le permite exponer fácilmente una clase List<T> existente como una colección de solo lectura.
Las clases genéricas Queue<T>, ConcurrentQueue<T>, Stack<T>, ConcurrentStack<T> y SortedList<TKey, TValue> corresponden a las clases no genéricas respectivas que tienen los mismos nombres.
Tipos adicionales
Hay varios tipos de colección genéricos que no tienen homólogos no genéricos. Algunas de ellas son:
LinkedList<T> es una lista vinculada de uso general que proporciona operaciones de inserción y eliminación O(1).
SortedDictionary<TKey, TValue> es un diccionario ordenado con operaciones de inserción y eliminación O (logn), lo que lo convierte en una alternativa útil de SortedList<TKey, TValue>.
KeyedCollection<TKey, TItem> es un híbrido entre una lista y un diccionario, lo que proporciona una manera de almacenar objetos que contienen sus propias claves.
BlockingCollection<T> implementa una clase de colección con funcionalidad de límite y bloqueo.
ConcurrentBag<T> permite insertar y quitar rápidamente elementos no ordenados.
LINQ to Objects
La característica LINQ to Objects permite usar consultas LINQ para obtener acceso a los objetos en memoria mientras el tipo de objeto implemente la interfaz System.Collections.IEnumerable o System.Collections.Generic.IEnumerable<T>. Las consultas LINQ proporcionan un modelo común para el acceso a datos; suelen ser más concisas y legibles que los bucles foreach estándar, y proporcionan capacidades de filtrado, ordenación y agrupación. Las consultas LINQ también pueden mejorar el rendimiento. Para obtener más información, vea LINQ to Objects y Parallel LINQ (PLINQ).
Funcionalidad adicional
Algunos de los tipos genéricos tienen funcionalidades que no se encuentran en los tipos de colección no genéricos. Por ejemplo, la clase List<T>, que corresponde a la clase ArrayList no genérica, tiene una serie de métodos que aceptan delegados genéricos, como el delegado Predicate<T> que le permite especificar métodos para buscar en la lista, el delegado Action<T> que representa métodos que actúan en cada uno de los elementos de la lista, y el delegado Converter<TInput, TOutput> que le permite definir conversiones entre tipos.
La clase List<T> le permite especificar sus propias implementaciones de interfaces genéricas de IComparer<T> para ordenar la lista y buscar en ella. Las clases SortedList<TKey, TValue> y SortedDictionary<TKey, TValue> también tienen esta capacidad. Además, estas clases permiten especificar comparadores en el momento de crear la colección. De forma similar, las clases Dictionary<TKey, TValue> y KeyedCollection<TKey, TItem> permiten al usuario especificar sus propios comparadores de igualdad.