Colecciones y estructuras de datosCollections and Data Structures

A menudo, los datos similares pueden controlarse de forma más eficaz si se almacenan y manipulan como si fuesen una colección.Similar data can often be handled more efficiently when stored and manipulated as a collection. Puede usar la clase System.Array o las clases de los espacios de nombres System.Collections, System.Collections.Generic, System.Collections.Concurrent y System.Collections.Immutable para agregar, quitar y modificar elementos individuales o intervalos de elementos de una colección.You can use the System.Array class or the classes in the System.Collections, System.Collections.Generic, System.Collections.Concurrent, System.Collections.Immutable namespaces to add, remove, and modify either individual elements or a range of elements in a collection.

Hay dos tipos principales de colecciones: las colecciones genéricas y las colecciones no genéricas.There are two main types of collections; generic collections and non-generic collections. Las colecciones genéricas se agregaron en la versión 2.0 de.NET Framework y son colecciones con seguridad de tipos en tiempo de compilación.Generic collections were added in the .NET Framework 2.0 and provide collections that are type-safe at compile time. Debido a esto, las colecciones genéricas normalmente ofrecen un mejor rendimiento.Because of this, generic collections typically offer better performance. Las colecciones genéricas aceptan un parámetro de tipo cuando se construyen y no requieren conversiones con el tipo Object al agregar o quitar elementos de la colección.Generic collections accept a type parameter when they are constructed and do not require that you cast to and from the Object type when you add or remove items from the collection. Además, la mayoría de colecciones genéricas son compatibles con aplicaciones de la Tienda WindowsWindows Store.In addition, most generic collections are supported in Tienda WindowsWindows Store apps. Las colecciones no genéricas almacenan elementos como Object, requieren conversión y la mayoría no son compatibles con el desarrollo de aplicaciones de la Tienda WindowsWindows Store.Non-generic collections store items as Object, require casting, and most are not supported for Tienda WindowsWindows Store app development. Sin embargo, puede que vea colecciones no genéricas en código antiguo.However, you may see non-generic collections in older code.

A partir de .NET Framework 4, las colecciones del espacio de nombres System.Collections.Concurrent proporcionan operaciones eficaces y seguras para subprocesos con el fin de obtener acceso a los elementos de la colección desde varios subprocesos.Starting with the .NET Framework 4, the collections in the System.Collections.Concurrent namespace provide efficient thread-safe operations for accessing collection items from multiple threads. Las clases de colección inmutables en el espacio de nombres System.Collections.Immutable (NuGet package) son intrínsecamente seguras para los subprocesos, ya que las operaciones se realizan en una copia de la colección original, mientras que la colección original no se puede modificar.The immutable collection classes in the System.Collections.Immutable namespace (NuGet package) are inherently thread-safe because operations are performed on a copy of the original collection and the original collection cannot be modified.

Características comunes de las coleccionesCommon collection features

Todas las colecciones ofrecen métodos para agregar, quitar o buscar elementos en la colección.All collections provide methods for adding, removing or finding items in the collection. Además, todas las colecciones que implementan directa o indirectamente las interfaces ICollection o ICollection<T> comparten estas características:In addition, all collections that directly or indirectly implement the ICollection interface or the ICollection<T> interface share these features:

Además, muchas clases de colecciones contienen las siguientes características:In addition, many collection classes contain the following features:

  • Propiedades de capacidad y recuentoCapacity and Count properties

    La capacidad de una colección es el número de elementos que puede contener.The capacity of a collection is the number of elements it can contain. El recuento de una colección es el número de elementos que realmente contiene.The count of a collection is the number of elements it actually contains. Algunas colecciones ocultan la capacidad, el recuento, o ambos.Some collections hide the capacity or the count or both.

    La mayoría de las colecciones expanden automáticamente su capacidad cuando se alcanza la capacidad actual.Most collections automatically expand in capacity when the current capacity is reached. La memoria se reasigna y los elementos de la antigua colección se copian en la nueva.The memory is reallocated, and the elements are copied from the old collection to the new one. Esto reduce el código necesario para utilizar la colección; sin embargo, el rendimiento de la colección podría verse afectado negativamente.This reduces the code required to use the collection; however, the performance of the collection might be negatively affected. Por ejemplo, en List<T>, si Count es menor que Capacity, el agregar un elemento supone una operación O(1).For example, for List<T>, If Count is less than Capacity, adding an item is an O(1) operation. Si es necesario aumentar la capacidad para alojar el nuevo elemento, agregar un elemento se convierte en una operación O(n), donde n es Count.If the capacity needs to be increased to accommodate the new element, adding an item becomes an O(n) operation, where n is Count. La mejor manera de evitar el rendimiento deficiente provocado por múltiples reasignaciones es establecer la capacidad inicial el tamaño estimado de la colección.The best way to avoid poor performance caused by multiple reallocations is to set the initial capacity to be the estimated size of the collection.

    BitArray es un caso especial; su capacidad es igual que su longitud, que es la misma que su recuento.A BitArray is a special case; its capacity is the same as its length, which is the same as its count.

  • Límite inferior coherenteA consistent lower bound

    El límite inferior de una colección es el índice de su primer elemento.The lower bound of a collection is the index of its first element. Todas las colecciones indizadas en el espacio de nombres System.Collections tienen un límite inferior de cero, lo que significa que están indizadas en 0.All indexed collections in the System.Collections namespaces have a lower bound of zero, meaning they are 0-indexed. De forma predeterminada, Array tiene un límite inferior de cero, pero se puede definir un límite inferior diferente mediante la creación de una instancia de la clase Array con Array.CreateInstance.Array has a lower bound of zero by default, but a different lower bound can be defined when creating an instance of the Array class using Array.CreateInstance.

  • Sincronización para el acceso de varios subprocesos (solo clases System.Collections).Synchronization for access from multiple threads (System.Collections classes only).

    Los tipos de colecciones no genéricas del espacio de nombres System.Collections proporcionan una seguridad de subprocesos con sincronización; normalmente se exponen a través de los miembros SyncRoot y IsSynchronized.Non-generic collection types in the System.Collections namespace provide some thread safety with synchronization; typically exposed through the SyncRoot and IsSynchronized members. Estas colecciones no son seguras para subprocesos de forma predeterminada.These collections are not thread-safe by default. Si necesita un acceso multiproceso escalable y eficaz a una colección, utilice una de las clases del espacio de nombres System.Collections.Concurrent o considere el uso de una colección inmutable.If you require scalable and efficient multi-threaded access to a collection, use one of the classes in the System.Collections.Concurrent namespace or consider using an immutable collection. Para obtener más información, consulte Colecciones seguras para subprocesos.For more information, see Thread-Safe Collections.

Elegir una colecciónChoosing a collection

En general, debería utilizar colecciones genéricas.In general, you should use generic collections. En la tabla siguiente se describen algunos escenarios habituales de las colecciones y las clases de colección que puede utilizar en esos escenarios.The following table describes some common collection scenarios and the collection classes you can use for those scenarios. Si es la primera vez que usa colecciones genéricas, con esta tabla le será más fácil elegir la colección genérica que funciona mejor para su tarea.If you are new to generic collections, this table will help you choose the generic collection that works the best for your task.

Deseo...I want to… Opciones de colección genéricaGeneric collection options Opciones de colección no genéricaNon-generic collection options Opciones de colección de subprocesos o inmutableThread-safe or immutable collection options
Almacenar elementos como pares clave/valor para una consulta rápida por claveStore items as key/value pairs for quick look-up by key Dictionary<TKey,TValue> Hashtable

(Colección de pares clave/valor que se organizan en función del código hash de la clave).(A collection of key/value pairs that are organized based on the hash code of the key.)
ConcurrentDictionary<TKey,TValue>

ReadOnlyDictionary<TKey,TValue>

ImmutableDictionary<TKey,TValue>
Acceso a elementos por índiceAccess items by index List<T> Array

ArrayList
ImmutableList<T>

ImmutableArray
Utilizar elementos FIFO (el primero en entrar es el primero en salir)Use items first-in-first-out (FIFO) Queue<T> Queue ConcurrentQueue<T>

ImmutableQueue<T>
Utilizar datos LIFO (el último en entrar es el primero en salir)Use data Last-In-First-Out (LIFO) Stack<T> Stack ConcurrentStack<T>

ImmutableStack<T>
Acceso a elementos de forma secuencialAccess items sequentially LinkedList<T> Sin recomendaciónNo recommendation Sin recomendaciónNo recommendation
Recibir notificaciones cuando se quitan o se agregan elementos a la colección.Receive notifications when items are removed or added to the collection. (implementa INotifyPropertyChanged y INotifyCollectionChanged)(implements INotifyPropertyChanged and INotifyCollectionChanged) ObservableCollection<T> Sin recomendaciónNo recommendation Sin recomendaciónNo recommendation
Una colección ordenadaA sorted collection SortedList<TKey,TValue> SortedList ImmutableSortedDictionary<TKey,TValue>

ImmutableSortedSet<T>
Un conjunto de funciones matemáticasA set for mathematical functions HashSet<T>

SortedSet<T>
Sin recomendaciónNo recommendation ImmutableHashSet<T>

ImmutableSortedSet<T>

TitleTitle DescripciónDescription
Seleccionar una clase de colecciónSelecting a Collection Class Describe las diferentes colecciones y le ayuda a seleccionar una para su escenario.Describes the different collections and helps you select one for your scenario.
Tipos de colección utilizados normalmenteCommonly Used Collection Types Describe los tipos de colección genéricos y no genéricos más utilizados, como System.Array, System.Collections.Generic.List<T> y System.Collections.Generic.Dictionary<TKey,TValue>.Describes commonly used generic and nongeneric collection types such as System.Array, System.Collections.Generic.List<T>, and System.Collections.Generic.Dictionary<TKey,TValue>.
Cuándo utilizar colecciones genéricasWhen to Use Generic Collections Describe el uso de los tipos de colección genéricos.Discusses the use of generic collection types.
Comparaciones y ordenaciones en coleccionesComparisons and Sorts Within Collections Describe el uso de las comparaciones de igualdad y ordenación en las colecciones.Discusses the use of equality comparisons and sorting comparisons in collections.
Tipos de colecciones ordenadasSorted Collection Types Describe las características y el funcionamiento de colecciones ordenadas.Describes sorted collections performance and characteristics
Tipos de las colecciones Hashtable y DictionaryHashtable and Dictionary Collection Types Describe las características de los tipos de diccionarios basados en hash genéricos y no genéricos.Describes the features of generic and non-generic hash-based dictionary types.
Colecciones seguras para subprocesosThread-Safe Collections Describe los tipos de colección, como System.Collections.Concurrent.BlockingCollection<T> y System.Collections.Concurrent.ConcurrentBag<T>, que admiten un acceso simultáneo seguro y eficaz desde varios subprocesos.Describes collection types such as System.Collections.Concurrent.BlockingCollection<T> and System.Collections.Concurrent.ConcurrentBag<T> that support safe and efficient concurrent access from multiple threads.
System.Collections.ImmutableSystem.Collections.Immutable Presenta las colecciones inalterables y proporciona vínculos a los tipos de colección.Introduces the immutable collections and provides links to the collection types.

ReferenciaReference

System.Array
System.Collections
System.Collections.Concurrent
System.Collections.Generic
System.Collections.Specialized
System.Linq
System.Collections.Immutable