Cuándo utilizar colecciones genéricas
Actualización: noviembre 2007
En general, es recomendable utilizar colecciones genéricas porque se obtiene la ventaja inmediata de la seguridad de tipos sin necesidad de derivar de un tipo de colección base e implementar miembros específicos de los tipos. Además, por lo general los tipos de colección genéricos tienen un mejor rendimiento que los tipos de colección no genéricos correspondientes (y mejor que el de los tipos derivados de tipos de colección base no genéricos) cuando los elementos de la colección son tipos de valor, porque con los genéricos no hay necesidad de realizar conversiones boxing de los elementos.
Los siguientes tipos genéricos corresponden a los tipos de colección existentes:
List<T> es la clase genérica que se corresponde con ArrayList.
Dictionary<TKey, TValue> es la clase genérica que se corresponde con Hashtable.
Collection<T> es la clase genérica que se corresponde con CollectionBase. Collection<T> se puede utilizar como clase base, pero a diferencia de CollectionBase, no es abstracta. Esto facilita mucho su uso.
ReadOnlyCollection<T> es la clase genérica que se corresponde con ReadOnlyCollectionBase. ReadOnlyCollection<T> no es una clase abstracta y tiene un constructor que facilita la exposición de un objeto List<T> como una colección de sólo lectura.
Las clases genéricas Queue<T>, Stack<T> y SortedList<TKey, TValue> corresponden a las respectivas clases no genéricas que tienen los mismos nombres.
Tipos adicionales
Hay varios tipos de colección genéricos que no tienen homólogos no genéricos:
LinkedList<T> es una lista vinculada de uso general que proporciona operaciones de inserción y eliminación O(1).
SortedDictionary<TKey, TValue> es un diccionario ordenado con operaciones de inserción y eliminación O (logn), lo que lo convierte en una alternativa útil de SortedList<TKey, TValue>.
KeyedCollection<TKey, TItem> es un híbrido entre una lista y un diccionario, lo que proporciona una manera de almacenar objetos que contienen sus propias claves.
LINQ to Objects
La característica LINQ to Objects le permite 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. Las consultas LINQ también pueden mejorar el rendimiento. Para obtener más información, consulte LINQ to Objects.
Funcionalidad adicional
Algunos de los tipos genéricos tienen funcionalidades que no se encuentran en los tipos de colección no genéricos. Por ejemplo, la clase List<T>, que corresponde a la clase ArrayList no genérica, tiene una serie de métodos que aceptan delegados genéricos, como el delegado Predicate<T> que le permite especificar métodos para buscar en la lista, el delegado Action<T> que representa métodos que actúan en cada uno de los elementos de la lista, y el delegado Converter<TInput, TOutput> que le permite definir conversiones entre tipos.
La clase List<T> le permite especificar sus propias implementaciones de interfaces genéricas de IComparer<T> para ordenar la lista y buscar en ella. Las clases SortedDictionary<TKey, TValue> y SortedList<TKey, TValue> también tienen esta capacidad y, además, permite especificar los comparadores cuando se crea la colección. De forma parecida, las clases Dictionary<TKey, TValue> y KeyedCollection<TKey, TItem> le permiten especificar sus propios comparadores de igualdad.
Vea también
Conceptos
Información general sobre los genéricos de .NET Framework