Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Asegúrese de elegir cuidadosamente la clase de colección. El uso del 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.
Tenga en cuenta las siguientes preguntas:
¿Necesita una lista secuencial donde normalmente se descarta el elemento después de recuperar su valor?
Si es así, considere la posibilidad de usar la Queue clase o la Queue<T> clase genérica si necesita un comportamiento primero dentro y primero en salir (FIFO). Considere usar la clase Stack o la clase genérica Stack<T> si necesita un comportamiento de último en entrar, primero en salir (LIFO). Para un acceso seguro desde varios subprocesos, use las versiones simultáneas ConcurrentQueue<T> y ConcurrentStack<T>. Para la inmutabilidad, tenga en cuenta las versiones inmutables ImmutableQueue<T> y ImmutableStack<T>.
Si no es así, considere la posibilidad de usar las otras colecciones.
¿Necesita acceder a los elementos en un orden determinado, como FIFO, LIFO o aleatorio?
La Queue clase , así como las Queue<T>clases genéricas , ConcurrentQueue<T>y ImmutableQueue<T> ofrecen acceso a FIFO. Para obtener más información, vea Cuándo usar una colección de Thread-Safe.
La Stack clase , así como las Stack<T>clases genéricas , ConcurrentStack<T>y ImmutableStack<T> ofrecen acceso a LIFO. Para obtener más información, vea Cuándo usar una colección de Thread-Safe.
La LinkedList<T> clase genérica permite el acceso secuencial desde la cabeza a la cola o desde la cola hasta la cabeza.
¿Necesita acceder a cada elemento por índice?
Las ArrayList clases y StringCollection y la List<T> clase genérica ofrecen acceso a sus elementos mediante el índice de base cero del elemento. Para lograr la inmutabilidad, considere 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 mediante 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, así como las clases genéricas KeyedCollection<TKey,TItem> y SortedList<TKey,TValue>, ofrecen acceso a sus elementos, ya sea mediante el índice basado en 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: use cualquiera de las colecciones basadas en la interfaz IList o en la interfaz genérica IList<T>. Para una opción inmutable, considere la IImmutableList<T> interfaz genérica.
Una clave y un valor: use cualquiera de las colecciones basadas en la interfaz IDictionary o en la interfaz genérica IDictionary<TKey,TValue>. Para una opción inmutable, considere las interfaces genéricas IImmutableSet<T> o IImmutableDictionary<TKey,TValue>.
Un valor con clave incrustada: use la KeyedCollection<TKey,TItem> clase genérica.
Una clave y varios valores: use la NameValueCollection clase .
¿Necesita ordenar los elementos de forma diferente de cómo se especificaron?
La Hashtable clase ordena sus elementos por sus códigos hash.
La SortedList clase y las SortedList<TKey,TValue> clases genéricas 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 un mejor rendimiento que SortedList<TKey,TValue>, mientras SortedList<TKey,TValue> que consume menos memoria.
ArrayList proporciona un método que toma una SortIComparer implementación como parámetro. Su homólogo genérico, la List<T> clase genérica, proporciona un Sort método que toma una implementación de la IComparer<T> interfaz genérica como parámetro.
¿Necesita búsquedas rápidas y recuperación de información?
- ListDictionary es más rápido que Hashtable para colecciones pequeñas (10 elementos o menos). La Dictionary<TKey,TValue> clase genérica proporciona una búsqueda más rápida que la SortedDictionary<TKey,TValue> clase genérica. 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 (basado en IList) y StringDictionary (basado 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 System.Collections.Generic espacio de nombres como colecciones de cadenas fuertemente tipadas especificando la String clase para sus argumentos de tipo genérico. 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 a los desarrolladores usar consultas LINQ para acceder a objetos en memoria siempre que el tipo de objeto implemente IEnumerable o IEnumerable<T>. Las consultas LINQ proporcionan un patrón común para acceder a los datos, suelen ser más concisos y legibles que los bucles estándar foreach y proporcionan funcionalidades 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, mediante un uso más eficaz de equipos de varios núcleos. Para obtener más información, vea Parallel LINQ (PLINQ).