Quando usar coleções genéricas
Usar coleções genéricas oferece o benefício automático da segurança de tipos sem precisar derivar de um tipo de coleção base e implementar membros específicos do tipo. Geralmente, tipos de coleção genérica também executam melhor do que os tipos de coleção não genérica correspondentes (e melhor do que tipos que são derivados de tipos de coleção base não genérica) quando os elementos da coleção forem tipos de valor, pois com genéricos não é necessário colocar os elementos em caixa.
Para programas destinados ao .NET Standard 1.0 ou posteriores, use as classes de coleção genérica no namespace System.Collections.Concurrent quando vários threads podem estar adicionando ou removendo itens da coleção simultaneamente. Além disso, quando a imutabilidade for desejada, considere as classes de coleção genéricas no namespace System.Collections.Immutable.
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 à Hashtable.
Collection<T> é a classe genérica que corresponde à CollectionBase. Collection<T> pode ser usada como uma classe base, mas, ao contrário de CollectionBase, não é abstrata, o que a torna muito mais fácil de usar.
ReadOnlyCollection<T> é a classe genérica que corresponde à ReadOnlyCollectionBase. ReadOnlyCollection<T> não é abstrata e tem um construtor que facilita expor uma List<T> existente como uma coleção somente leitura.
As classes genéricas Queue<T>, ConcurrentQueue<T>, ImmutableQueue<T>, ImmutableArray<T>, SortedList<TKey,TValue> e ImmutableSortedSet<T> correspondem às classes não genéricas respectivas com os mesmos nomes.
Tipos adicionais
Vários tipos de coleção genérica não têm equivalentes não genéricas. Eles incluem o seguinte:
LinkedList<T> é uma lista vinculada de uso geral que fornece operações de inserção e remoção O(1).
SortedDictionary<TKey,TValue> é um dicionário classificado com operações de inserção e recuperação O(log
n
), 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 contenham suas próprias chaves.
BlockingCollection<T> implementa uma classe de coleção com funcionalidade de delimitação e bloqueio.
ConcurrentBag<T> fornece rápida inserção e remoção de elementos não classificados.
Construtores imutáveis
Quando você deseja funcionalidade de imutabilidade em seu aplicativo, o namespace System.Collections.Immutable oferece tipos de coleções genéricas que você pode usar. Todos os tipos de coleção imutáveis oferecem classes Builder
que podem otimizar o desempenho quando você estiver executando várias mutações. A classe Builder
agrupa operações em um estado mutável. Quando todas as mutações tiverem sido concluídas, chame o método ToImmutable
para "congelar" todos os nós e criar uma coleção genérica imutável, por exemplo, um ImmutableList<T>.
O objeto Builder
pode ser criado chamando o método CreateBuilder()
não genérico. Em uma instância Builder
, você pode chamar ToImmutable()
. Da mesma forma, na coleção Immutable*
, você pode chamar ToBuilder()
para criar uma instância de construtor a partir da coleção imutável genérica. Veja a seguir os vários tipos Builder
.
- ImmutableArray<T>.Builder
- ImmutableDictionary<TKey,TValue>.Builder
- ImmutableHashSet<T>.Builder
- ImmutableList<T>.Builder
- ImmutableSortedDictionary<TKey,TValue>.Builder
- ImmutableSortedSet<T>.Builder
Objetos LINQ to
O recurso LINQ para objetos permite que você use consultas LINQ para acessar objetos na memória, desde que o tipo de objeto implemente a interface System.Collections.IEnumerable ou System.Collections.Generic.IEnumerable<T>. As consultas LINQ fornecem um padrão comum para acessar dados, são geralmente mais concisas e legíveis que os loops padrão foreach
e fornecem capacidades de filtragem, ordenação e agrupamento. Consultas LINQ também podem melhorar o desempenho. Para obter mais informações, confira LINQ to Objects (C#), LINQ to Objects (Visual Basic) e PLINQ (Parallel LINQ).
Funcionalidade adicional
Alguns dos tipos genéricos possuem funcionalidades que não se encontram em tipos de coleção genérica. Por exemplo, a classe List<T>, que corresponde à classe ArrayList não genérica, possui vários métodos que aceitam delegados genéricos, tais como o delegado Predicate<T> que permite que você especifique métodos para pesquisa na lista, o delegado Action<T> que representa métodos que atuam em cada elemento da lista e o delegado Converter<TInput,TOutput> que permite definir conversões entre tipos.
A classe List<T> permite que você especifique suas próprias implementações de interface genérica IComparer<T> para classificação e pesquisa na lista. As classes SortedDictionary<TKey,TValue> e SortedList<TKey,TValue> também possuem esse recurso. Além disso, essas classes permitem que você especifique comparadores quando a coleção for criada. De maneira semelhante, as classes Dictionary<TKey,TValue> e KeyedCollection<TKey,TItem> permitem que você especifique seus próprios comparadores de igualdade.