Cuándo utilizar colecciones genéricas
El uso de colecciones genéricas ofrece la ventaja inmediata de la seguridad de tipos sin necesidad de derivar de un tipo de colección base ni de implementar miembros específicos de tipo. Los tipos de colección genéricos también suelen funcionan mejor que los correspondientes tipos de colección no genéricos (y mejor que los tipos que se derivan de los tipos de colección base no genéricos) cuando los elementos de la colección son tipos de valor. Esto se debe a que con los genéricos no es necesario realizar una conversión boxing de los elementos.
En programas destinados a .NET Standard 1.0 o una versión posterior, utilice las clases de colección genérica en el espacio de nombres System.Collections.Concurrent cuando varios subprocesos puedan agregar o quitar elementos de la colección simultáneamente. Además, cuando busque inmutabilidad, tenga en cuenta las clases de colección genéricas en el espacio de nombres System.Collections.Immutable.
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> puede utilizarse como una clase base pero, a diferencia de CollectionBase, no es abstracta, lo que hace que sea mucho más fácil de usar.
ReadOnlyCollection<T> es la clase genérica que se corresponde con ReadOnlyCollectionBase. La colección ReadOnlyCollection<T> no es abstracta y tiene un constructor que hace más fácil exponer una colección List<T> existente como de solo lectura.
Las clases genéricas Queue<T>, ConcurrentQueue<T>, ImmutableQueue<T>, ImmutableArray<T>, SortedList<TKey,TValue> y ImmutableSortedSet<T> se corresponden con las respectivas clases no genéricas de igual nombre.
Tipos adicionales
Hay varios tipos de colección genéricos que no tienen un tipo homólogo no genérico. Entre esos tipos se incluyen los siguientes:
LinkedList<T> es una lista vinculada de uso general que proporciona operaciones de eliminación e inserción O(1).
SortedDictionary<TKey,TValue> es un diccionario ordenado con operaciones de eliminación e inserción O(log
n
), lo que lo convierte en una alternativa útil a 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> proporciona una rápida inserción y eliminación de elementos no ordenados.
Generadores inmutables
Si quiere disponer de la funcionalidad de inmutabilidad en la aplicación, el espacio de nombres System.Collections.Immutable ofrece tipos de colección genéricos que se pueden usar. Todos los tipos de colección inmutables ofrecen clases Builder
que pueden optimizar el rendimiento cuando se realicen varias mutaciones. La clase Builder
agrupa las operaciones en un estado mutable. Cuando se hayan completado todas las mutaciones, llame al método ToImmutable
para "inmovilizar" todos los nodos y crear una colección genérica inmutable, por ejemplo, una colección ImmutableList<T>.
Se puede crear el objeto Builder
llamando al método CreateBuilder()
no genérico. En una instancia de Builder
, se puede llamar a ToImmutable()
. Del mismo modo, en la colección Immutable*
, se puede llamar a ToBuilder()
para crear una instancia de generador a partir de la colección inmutable genérica. Estos son los distintos tipos de Builder
.
- ImmutableArray<T>.Builder
- ImmutableDictionary<TKey,TValue>.Builder
- ImmutableHashSet<T>.Builder
- ImmutableList<T>.Builder
- ImmutableSortedDictionary<TKey,TValue>.Builder
- ImmutableSortedSet<T>.Builder
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 patrón común para acceder a los 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 más información, vea LINQ to Objects (C#), LINQ to Objects (Visual Basic) 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 se corresponde con la clase ArrayList no genérica, tiene una serie de métodos que aceptan delegados genéricos, como el delegado Predicate<T> que permite especificar los métodos de búsqueda en la lista, el delegado Action<T> que representa los métodos que actúan en cada elemento de la lista y el delegado Converter<TInput,TOutput> que permite definir conversiones entre tipos.
La clase List<T> permite especificar sus propias implementaciones de interfaz genérica IComparer<T> para la ordenación y búsqueda en la lista. Las clases SortedDictionary<TKey,TValue> y SortedList<TKey,TValue> también tienen esta capacidad. Además, estas clases le permiten especificar los comparadores cuando se crea la colección. De forma similar, las clases Dictionary<TKey,TValue> y KeyedCollection<TKey,TItem> le permiten especificar sus propios comparadores de igualdad.