Seleccionar una clase de colección
Tenga cuidado al elegir la clase de una colección. La utilización de un tipo equivocado podría limitar el uso de la colección. En general, evite utilizar los tipos en el espacio de nombres System.Collections a menos que tenga específicamente la versión 1.1 de .NET Framework como destino. Es preferible usar las versiones genéricas y simultáneas de las colecciones gracias a su mayor seguridad de tipos y otras mejoras.
Considere las siguientes cuestiones:
¿Necesita una lista secuencial en la que normalmente se descarta el elemento tras recuperar su valor?
Si la respuesta es sí, considere la posibilidad de utilizar la clase Queue o la clase genérica Queue<T> en caso de que necesite un comportamiento de tipo FIFO ("primero en entrar, primero en salir"). Considere la posibilidad de utilizar la clase Stack o la clase genérica Stack<T> en caso de que necesite un comportamiento de tipo LIFO ("último en entrar, primero en salir"). Para un acceso seguro desde varios subprocesos, utilice las versiones simultáneas ConcurrentQueue<T> y ConcurrentStack<T>.
Si la respuesta es no, considere el uso de las demás colecciones.
¿Necesita obtener acceso a los elementos en cierto orden, como FIFO, LIFO o aleatoriamente?
La clase Queue y la clase genérica Queue<T> o ConcurrentQueue<T> proporcionan un acceso de tipo FIFO. Para obtener más información, vea Cuándo usar una colección segura para subprocesos.
La clase Stack y la clase genérica Stack<T> o ConcurrentStack<T> proporcionan un acceso de tipo LIFO. Para obtener más información, vea Cuándo usar una colección segura para subprocesos.
La clase genérica LinkedList<T> permite un acceso secuencial, tanto desde el encabezado hasta el final como desde el final hasta el encabezado.
¿Necesita tener acceso a cada elemento por el índice?
Las clases ArrayList y StringCollection y la clase genérica List<T> proporcionan acceso a sus elementos mediante el índice de base cero del elemento.
Las clases Hashtable, SortedList, ListDictionary y StringDictionary y las clases genéricas Dictionary<TKey, TValue> y SortedDictionary<TKey, TValue> proporcionan acceso a sus elementos mediante la clave del elemento.
Las clases NameObjectCollectionBase y NameValueCollection y las clases genéricas KeyedCollection<TKey, TItem> y SortedList<TKey, TValue> proporcionan acceso a sus elementos mediante el índice de base cero o 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: utilice cualquiera de las colecciones basadas en la interfaz IList o en la interfaz genérica IList<T>.
Una clave y un valor: utilice cualquiera de las colecciones basadas en la interfaz IDictionary o en la interfaz genérica IDictionary<TKey, TValue>.
Un valor con clave incrustada: utilice la clase genérica KeyedCollection<TKey, TItem>.
Una clave y varios valores: utilice la clase NameValueCollection.
¿Necesita ordenar los elementos de forma diferente a como se introdujeron?
La clase Hashtable ordena sus elementos en función de los códigos hash de dichos elementos.
La clase SortedList y las clases genéricas SortedDictionary<TKey, TValue> y SortedList<TKey, TValue> ordenan sus elementos en función de la clave, conforme a las implementaciones de la interfaz IComparer y de la interfaz genérica IComparer<T>.
ArrayList proporciona un método Sort que toma como parámetro una implementación de IComparer. Su equivalente genérico, es decir, la clase genérica List<T>, proporciona un método Sort que toma como parámetro una implementación de la interfaz genérica IComparer<T>.
¿Necesita buscar y recuperar la información rápidamente?
- ListDictionary ofrece más rapidez que Hashtable en colecciones pequeñas (de un máximo de 10 elementos). La clase genérica Dictionary<TKey, TValue> proporciona una búsqueda más rápida 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 obtener más información sobre ambos tipos multiproceso, vea Cuándo usar una colección segura para subprocesos.
¿Necesita colecciones que acepten sólo cadenas?
StringCollection (basada en IList) y StringDictionary (basada en IDictionary) están en el espacio de nombres System.Collections.Specialized.
Además, puede utilizar cualquiera de las clases de colección genéricas del espacio de nombres System.Collections.Generic como colecciones de cadenas con establecimiento inflexible de tipos; para ello, tiene que especificar la clase String para sus argumentos de tipo genérico.
LINQ to Objects y PLINQ
LINQ to Objects permite a los programadores usar consultas LINQ para tener acceso a los objetos en memoria mientras el tipo de objeto implemente IEnumerable o 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. Para obtener más información, vea LINQ to Objects.
PLINQ proporciona una implementación paralela de LINQ to Objects que puede proporcionar una ejecución de consultas más rápida en muchos escenarios, a través de un uso más eficaz de equipos de varios núcleos. Para obtener más información, vea Parallel LINQ (PLINQ).
Vea también
Referencia
System.Collections.Specialized
Conceptos
Colecciones seguras para subprocesos