Cuándo utilizar colecciones genéricasWhen to use generic collections

El uso de colecciones genéricas ofrece la ventaja inmediata de la seguridad de tipos sin necesidad de derivar de un tipo de colección base ni de implementar miembros específicos de tipo.Using generic collections gives you the automatic benefit of type safety without having to derive from a base collection type and implement type-specific members. Los tipos de colección genéricos también suelen funcionan mejor que los correspondientes tipos de colección no genéricos (y mejor que los tipos que se derivan de los tipos de colección base no genéricos) cuando los elementos de la colección son tipos de valor. Esto se debe a que con los genéricos no es necesario realizar una conversión boxing de los elementos.Generic collection types also generally perform better than the corresponding nongeneric collection types (and better than types that are derived from nongeneric base collection types) when the collection elements are value types, because with generics, there's no need to box the elements.

En programas destinados a .NET Standard 1.0 o una versión posterior, utilice las clases de colección genérica en el espacio de nombres System.Collections.Concurrent cuando varios subprocesos puedan agregar o quitar elementos de la colección simultáneamente.For programs that target .NET Standard 1.0 or later, use the generic collection classes in the System.Collections.Concurrent namespace when multiple threads might be adding or removing items from the collection concurrently. Además, cuando busque inmutabilidad, tenga en cuenta las clases de colección genéricas en el espacio de nombres System.Collections.Immutable.Additionally, when immutability is desired, consider the generic collection classes in the System.Collections.Immutable namespace.

Los siguientes tipos genéricos corresponden a los tipos de colección existentes:The following generic types correspond to existing collection types:

Tipos adicionalesAdditional Types

Hay varios tipos de colección genéricos que no tienen un tipo homólogo no genérico.Several generic collection types do not have nongeneric counterparts. Entre esos tipos se incluyen los siguientes:They include the following:

Generadores inmutablesImmutable builders

Si quiere disponer de la funcionalidad de inmutabilidad en la aplicación, el espacio de nombres System.Collections.Immutable ofrece tipos de colección genéricos que se pueden usar.When you desire immutability functionality in your app, the System.Collections.Immutable namespace offers generic collection types you can use. Todos los tipos de colección inmutables ofrecen clases Builder que pueden optimizar el rendimiento cuando se realicen varias mutaciones.All of the immutable collection types offer Builder classes that can optimize performance when you're performing multiple mutations. La clase Builder agrupa las operaciones en un estado mutable.The Builder class batches operations in a mutable state. Cuando se hayan completado todas las mutaciones, llame al método ToImmutable para "inmovilizar" todos los nodos y crear una colección genérica inmutable, por ejemplo, una colección ImmutableList<T>.When all mutations have been completed, call the ToImmutable method to "freeze" all nodes and create an immutable generic collection, for example, an ImmutableList<T>.

Se puede crear el objeto Builder llamando al método CreateBuilder() no genérico.The Builder object can be created by calling the nongeneric CreateBuilder() method. En una instancia de Builder, se puede llamar a ToImmutable().From a Builder instance, you can call ToImmutable(). Del mismo modo, en la colección Immutable*, se puede llamar a ToBuilder() para crear una instancia de generador a partir de la colección inmutable genérica.Likewise, from the Immutable* collection, you can call ToBuilder() to create a builder instance from the generic immutable collection. Estos son los distintos tipos de Builder.The following are the various Builder types.

LINQ to ObjectsLINQ to Objects

La característica LINQ to Objects permite usar consultas LINQ para obtener acceso a los objetos en memoria mientras el tipo de objeto implemente la interfaz System.Collections.IEnumerable o System.Collections.Generic.IEnumerable<T> .The LINQ to Objects feature enables you to use LINQ queries to access in-memory objects as long as the object type implements the System.Collections.IEnumerable or System.Collections.Generic.IEnumerable<T> interface. Las consultas LINQ proporcionan un patrón común para acceder a los datos; suelen ser más concisas y legibles que los bucles foreach estándar y proporcionan capacidades de filtrado, ordenación y agrupación.LINQ queries provide a common pattern for accessing data; are typically more concise and readable than standard foreach loops; and provide filtering, ordering, and grouping capabilities. Las consultas LINQ también pueden mejorar el rendimiento.LINQ queries can also improve performance. Para más información, vea LINQ to Objects (C#), LINQ to Objects (Visual Basic) y Parallel LINQ (PLINQ).For more information, see LINQ to Objects (C#), LINQ to Objects (Visual Basic), and Parallel LINQ (PLINQ).

Funcionalidad adicionalAdditional Functionality

Algunos de los tipos genéricos tienen funcionalidades que no se encuentran en los tipos de colección no genéricos.Some of the generic types have functionality that is not found in the nongeneric collection types. Por ejemplo, la clase List<T> , que se corresponde con la clase ArrayList no genérica, tiene una serie de métodos que aceptan delegados genéricos, como el delegado Predicate<T> que permite especificar los métodos de búsqueda en la lista, el delegado Action<T> que representa los métodos que actúan en cada elemento de la lista y el delegado Converter<TInput,TOutput> que permite definir conversiones entre tipos.For example, the List<T> class, which corresponds to the nongeneric ArrayList class, has a number of methods that accept generic delegates, such as the Predicate<T> delegate that allows you to specify methods for searching the list, the Action<T> delegate that represents methods that act on each element of the list, and the Converter<TInput,TOutput> delegate that lets you define conversions between types.

La clase List<T> permite especificar sus propias implementaciones de interfaz genérica IComparer<T> para la ordenación y búsqueda en la lista.The List<T> class allows you to specify your own IComparer<T> generic interface implementations for sorting and searching the list. Las clases SortedDictionary<TKey,TValue> y SortedList<TKey,TValue> también tienen esta capacidad.The SortedDictionary<TKey,TValue> and SortedList<TKey,TValue> classes also have this capability. Además, estas clases le permiten especificar los comparadores cuando se crea la colección.In addition, these classes let you specify comparers when the collection is created. De forma similar, las clases Dictionary<TKey,TValue> y KeyedCollection<TKey,TItem> le permiten especificar sus propios comparadores de igualdad.In similar fashion, the Dictionary<TKey,TValue> and KeyedCollection<TKey,TItem> classes let you specify your own equality comparers.

Vea tambiénSee also