Seleccionar una clase de colección
Actualización: noviembre 2007
Es importante elegir cuidadosamente la clase System.Collections. La utilización de un tipo equivocado podría limitar el uso de la colección.
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").
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> proporcionan un acceso de tipo FIFO.
La clase Stack y la clase genérica Stack<T> proporcionan un acceso de tipo LIFO.
La clase genérica LinkedList<T> permite un acceso secuencial, tanto desde el encabezado hasta el final como desde el final hasta el encabezado.
El resto de las colecciones ofrecen acceso aleatorio.
¿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>.
¿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
LINQ to Objects permite a los programadores usar consultas LINQ para tener acceso a los objetos en memoria mientras el tipo de objeto implementa 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. Además, las consultas LINQ pueden producir también un incremento del rendimiento. Para obtener más información, vea LINQ to Objects.
Vea también
Referencia
System.Collections.Specialized