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:

Tipos adicionais

Vários tipos de coleção genérica não têm equivalentes não genéricas. Eles incluem o seguinte:

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.

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.

Confira também