Quando usar coleções genéricas
O uso de coleções genéricas oferece o benefício automático da segurança de tipo sem ter que derivar de um tipo de coleção base e implementar membros específicos do tipo. Os tipos de coleção genéricos também geralmente têm um desempenho melhor do que os tipos de coleção não genéricos correspondentes (e melhor do que os tipos derivados de tipos de coleção base não genéricos) quando os elementos de coleção são tipos de valor, porque com genéricos, não há necessidade de encaixotar os elementos.
Para programas destinados ao System.Collections.Concurrent .NET Standard 1.0 ou posterior, use as classes de coleção genéricas no namespace quando vários threads puderem 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 System.Collections.Immutable namespace.
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 a CollectionBase. Collection<T> pode ser usado como uma classe base, mas ao contrário CollectionBasedo , não é abstrato, o que torna muito mais fácil de usar.
ReadOnlyCollection<T> é a classe genérica que corresponde a ReadOnlyCollectionBase. ReadOnlyCollection<T> não é abstrato e tem um construtor que facilita a exposição de um existente List<T> como uma coleção somente leitura.
As Queue<T>classes , ConcurrentQueue<T>, ImmutableQueue<T>, ImmutableArray<T>, SortedList<TKey,TValue>, e ImmutableSortedSet<T> genéricas correspondem às respetivas classes não genéricas com os mesmos nomes.
Tipos Adicionais
Vários tipos de coleção genérica não têm contrapartidas não genéricas. Entre eles, incluem-se:
LinkedList<T> é uma lista vinculada de uso geral que fornece operações de inserção e remoção de 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 ao 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 Collection com funcionalidade de delimitação e bloqueio.
ConcurrentBag<T> Proporciona rápida inserção e remoção de elementos não ordenados.
Construtores imutáveis
Quando você deseja a funcionalidade de imutabilidade em seu aplicativo, o System.Collections.Immutable namespace oferece tipos de coleção genéricos que você pode usar. Todos os tipos de coleção imutáveis oferecem Builder
classes que podem otimizar o desempenho quando você está executando várias mutações. A Builder
classe agrupa operações em um estado mutável. Quando todas as mutações tiverem sido concluídas, chame o ToImmutable
método para "congelar" todos os nós e crie uma coleção genérica imutável, por exemplo, um ImmutableList<T>.
O Builder
objeto pode ser criado chamando o método não genérico CreateBuilder()
. A partir de uma Builder
instância, você pode chamar ToImmutable()
. Da mesma forma, a partir da Immutable*
coleção, você pode chamar ToBuilder()
para criar uma instância do construtor a partir da coleção imutável genérica. Seguem-se os vários Builder
tipos.
- ImmutableArray<T>.Builder
- ImmutableDictionary<TKey,TValue>.Builder
- ImmutableHashSet<T>.Builder
- ImmutableList<T>.Builder
- ImmutableSortedDictionary<TKey,TValue>.Builder
- ImmutableSortedSet<T>.Builder
LINQ para objetos
O recurso LINQ to Objects permite que você use consultas LINQ para acessar objetos na memória, desde que o tipo de objeto implemente a System.Collections.IEnumerable interface ou System.Collections.Generic.IEnumerable<T> . As consultas LINQ fornecem um padrão comum para acessar dados; são normalmente mais concisos e legíveis do que os loops padrão foreach
e fornecem recursos de filtragem, ordenação e agrupamento. As consultas LINQ também podem melhorar o desempenho. Para obter mais informações, consulte LINQ to Objects (C#), LINQ to Objects (Visual Basic) e Parallel LINQ (PLINQ).
Funcionalidade Adicional
Alguns dos tipos genéricos têm funcionalidade que não é encontrada nos tipos de coleção não genéricos. Por exemplo, a List<T> classe, que corresponde à classe não genérica ArrayList , tem vários métodos que aceitam delegados genéricos, como o Predicate<T> delegado que permite especificar métodos para pesquisar a lista, o Action<T> delegado que representa métodos que atuam em cada elemento da lista e o Converter<TInput,TOutput> delegado que permite definir conversões entre tipos.
A List<T> classe permite que você especifique suas próprias IComparer<T> implementações de interface genéricas para classificar e pesquisar a lista. As SortedDictionary<TKey,TValue> classes e SortedList<TKey,TValue> também têm essa capacidade. Além disso, essas classes permitem especificar comparadores quando a coleção é criada. Da mesma forma, as Dictionary<TKey,TValue> classes e KeyedCollection<TKey,TItem> permitem que você especifique seus próprios comparadores de igualdade.