Quando Usar Coleções Genéricas
Geralmente, é recomendável usar coleções genéricas, porque você ganha a vantagem imediata de segurança de tipo sem ter de derivar de um tipo de coleção base e implementar membros específicos do tipo. Tipos de coleção genérica também geralmente executar melhor do que os tipos de coleção não genérica correspondentes (e melhor do que os tipos derivados de tipos de coleção base não genéricos) quando os elementos da coleção são tipos de valor, porque com genéricos não é necessário colocar os elementos em caixas.
Para os programas destinados a .NET Framework versão 4 ou posterior, você deve usar as classes de coleção genérica de System.Collections.Concurrent namespace quando vários segmentos que podem adicionar ou remover itens da coleção simultaneamente.
Os seguintes tipos genéricos correspondem aos tipos de coleção existentes:
Dictionary<TKey, TValue>e ConcurrentDictionary<TKey, TValue> são as classes genéricas que correspondem a Hashtable.
Collection<T> é a classe genérica que corresponde ao CollectionBase. Collection<T>pode ser usado como uma classe base, mas diferentemente CollectionBase, que é abstrato. Isso o torna muito mais fácil de usar.
ReadOnlyCollection<T> é a classe genérica que corresponde ao ReadOnlyCollectionBase. ReadOnlyCollection<T>não é abstrata e tem um construtor que facilita a expor uma existente List<T> como uma coleção somente leitura.
O Queue<T>, ConcurrentQueue<T>, Stack<T>, ConcurrentStack<T>, e SortedList<TKey, TValue> classes genéricas correspondem às respectivas classes não genérico com o mesmo nomes.
Tipos adicionais
Vários tipos de coleção genérica não possuem contrapartes não genérico. Eles incluem o seguinte:
LinkedList<T> é uma lista vinculada de uso geral que fornece operações O(1) de inserção e remoção.
SortedDictionary<TKey, TValue> é um dicionário classificado com operações O (log n) de inserção e de recuperação, o que o torna uma alternativa útil para SortedList<TKey, TValue>.
KeyedCollection<TKey, TItem> é um híbrido entre uma lista e um dicionário, que fornece uma maneira de armazenar objetos que contêm suas próprias chaves.
BlockingCollection<T>implementa uma classe de coleção com delimitadora e a funcionalidade de bloqueio.
ConcurrentBag<T>oferece rápida inserção e remoção de elementos não ordenados.
LINQ para Objetos
LINQ to Objects o recurso de permite usar consultas LINQ para acessar objetos em memória, como o tipo de objeto implementa o System.Collections.IEnumerable ou System.Collections.Generic.IEnumerable<T> interface. Consultas LINQ fornecem um padrão comum para acessar dados, são geralmente mais concisas e legíveis que loops foreach padrão e fornecem recursos de filtragem, classificação e agrupamento. Consultas LINQ também podem melhorar o desempenho. Para obter mais informações, consulte LINQ para Objetos e Parallel LINQ PLINQ).
Funcionalidade adicional
Alguns dos tipos genéricos possuem funcionalidades que não são encontradas nos tipos de coleção não genéricas. Por exemplo, a classe List<T>, que corresponde à classe não genérica ArrayList, tem um número de métodos que aceitam representantes genéricos, como representante Predicate<T> que permite que você especifique métodos para pesquisar a lista, o representante Action<T> que representa métodos que atuam em cada elemento da lista, e o representante Converter<TInput, TOutput> que permite que você defina conversões entre tipos.
A classe List<T> permite que você especifique suas próprias implementações IComparer<T> de interface genérica para classificação e pesquisa da lista. O SortedDictionary<TKey, TValue> e SortedList<TKey, TValue> classes também têm esse recurso. Além disso, essas classes permitem especificar comparadores, quando a coleção é criada. De modo similar, o Dictionary<TKey, TValue> e KeyedCollection<TKey, TItem> classes permitem que você especifique seu próprio comparadores de igualdade.