Seleccionar una clase de colección
Asegúrese de elegir con cuidado la clase de colección. Usar un tipo incorrecto puede restringir el uso de la colección.
Importante
Evite usar los tipos del espacio de nombres System.Collections. Se recomiendan las versiones genéricas y simultáneas de las colecciones por la mayor seguridad de los tipos y otras mejoras.
Pregúntese lo siguiente:
¿Necesita una lista secuencial en la que normalmente se descarta el elemento después de recuperar su valor?
En caso afirmativo, considere usar la clase Queue o la clase genérica Queue<T> si necesita un comportamiento de tipo primero en entrar, primero en salir (FIFO). Considere usar la clase Stack o la clase genérica Stack<T> si necesita un comportamiento de tipo último en entrar, primero en salir (LIFO). Para obtener acceso seguro desde varios subprocesos, use las versiones simultáneas ConcurrentQueue<T> y ConcurrentStack<T>. En el caso de la inmutabilidad, tenga en cuenta las versiones inmutables, ImmutableQueue<T> y ImmutableStack<T>.
En caso contrario, considere usar las demás colecciones.
¿Necesita acceder a los elementos en cierto orden, como FIFO, LIFO o aleatorio?
La clase Queue, así como las clases genéricas Queue<T>, ConcurrentQueue<T> y ImmutableQueue<T>, ofrecen acceso FIFO. Para obtener más información, consulte Cuándo usar una colección segura para subprocesos.
La clase Stack, así como las clases genéricas Stack<T>, ConcurrentStack<T> y ImmutableStack<T>, ofrecen acceso LIFO. Para obtener más información, consulte Cuándo usar una colección segura para subprocesos.
La clase genérica LinkedList<T> permite el acceso secuencial desde el encabezado hasta el final o desde el final hasta el encabezado.
¿Necesita acceder a cada elemento por índice?
Las clases ArrayList y StringCollection y la clase genérica List<T> ofrecen acceso a sus elementos por el índice de base cero del elemento. En el caso de la inmutabilidad, tenga en cuenta las versiones genéricas inmutables, ImmutableArray<T> y ImmutableList<T>.
Las clases Hashtable, SortedList, ListDictionary y StringDictionary, y las clases genéricas Dictionary<TKey,TValue> y SortedDictionary<TKey,TValue> ofrecen acceso a sus elementos por la clave del elemento. Además, hay versiones inmutables de varios tipos correspondientes: ImmutableHashSet<T>, ImmutableDictionary<TKey,TValue>, ImmutableSortedSet<T> y ImmutableSortedDictionary<TKey,TValue>.
Las clases NameObjectCollectionBase y NameValueCollection, y las clases genéricas KeyedCollection<TKey,TItem> y SortedList<TKey,TValue> ofrecen acceso a sus elementos por el índice de base cero o por la clave del elemento.
¿Cada elemento contendrá un valor, una combinación de una clave y un valor, o una combinación de una clave y varios valores?
Un valor: use cualquiera de las colecciones basadas en la interfaz IList o en la interfaz genérica IList<T>. En el caso de una opción inmutable, tenga en cuenta la interfaz genérica de IImmutableList<T>.
Una clave y un valor: use cualquiera de las colecciones basadas en la interfaz IDictionary o en la interfaz genérica IDictionary<TKey,TValue>. En el caso de una opción inmutable, tenga en cuenta las interfaces genérica de IImmutableSet<T> o IImmutableDictionary<TKey,TValue>.
Un valor con clave insertada: use la clase genérica KeyedCollection<TKey,TItem>.
Una clave y varios valores: use la clase NameValueCollection.
¿Necesita ordenar los elementos de manera diferente a como se especificaron?
La clase Hashtable ordena los elementos por sus códigos hash.
La clase SortedList y las clases genéricas SortedList<TKey,TValue> y SortedDictionary<TKey,TValue> ordenan sus elementos por la clave. El criterio de ordenación se basa en la implementación de la interfaz IComparer para la clase SortedList y en la implementación de la interfaz genérica IComparer<T> para las clases genéricas SortedList<TKey,TValue> y SortedDictionary<TKey,TValue>. De los dos tipos genéricos, SortedDictionary<TKey,TValue> ofrece mejor rendimiento que SortedList<TKey,TValue>, mientras que SortedList<TKey,TValue> consume menos memoria.
ArrayList proporciona un método Sort que toma una implementación de IComparer como parámetro. Su homóloga genérica, la clase genérica List<T>, proporciona un método Sort que toma una implementación de la interfaz genérica IComparer<T> como parámetro.
¿Necesita realizar búsquedas y recuperaciones rápidas de información?
- ListDictionary es más rápida que Hashtable para colecciones pequeñas (de 10 elementos o menos). La clase genérica Dictionary<TKey,TValue> proporciona búsquedas más rápidas que la clase genérica SortedDictionary<TKey,TValue>. La implementación multiproceso es ConcurrentDictionary<TKey,TValue>. ConcurrentBag<T> proporciona una inserción multiproceso rápida para datos no ordenados. Para más información sobre ambos tipos multiproceso, consulte Cuándo usar una colección segura para subprocesos.
¿Necesita colecciones que acepten solo cadenas?
StringCollection (basada en IList) y StringDictionary (basada en IDictionary) están en el espacio de nombres System.Collections.Specialized.
Además, puede usar cualquiera de las clases de colección genéricas del espacio de nombres System.Collections.Generic como colecciones de cadenas fuertemente tipadas especificando la clase String para sus argumentos de tipo genéricos. Por ejemplo, puede declarar una variable para que sea de tipo List<String> o Dictionary<String,String>.
LINQ to Objects y PLINQ
LINQ to Objects permite usar consultas LINQ para acceder a los objetos en memoria siempre que el tipo de objeto implemente las interfaces IEnumerable o IEnumerable<T>. Las consultas LINQ proporcionan un modelo común para acceder a los datos; suelen ser más concisas y legibles que los bucles foreach
estándar y proporcionan funciones de filtrado, ordenación y agrupación. Para obtener más información, vea LINQ to Objects (C#) y LINQ to Objects (Visual Basic).
PLINQ proporciona una implementación paralela de LINQ to Objects que puede ofrecer una ejecución de consultas más rápida en muchos escenarios gracias a un uso más eficaz de los equipos de varios núcleos. Para más información, consulte Parallel LINQ (PLINQ).