Selecionando uma classe de coleção
Certifique-se de escolher sua classe de coleção com cuidado. A utilização do tipo errado pode restringir o uso da coleção.
Importante
Evite usar os tipos no namespace System.Collections. As versões genéricas e simultâneas das coleções são as recomendadas devido à maior segurança de tipos e outras melhorias.
Considere as seguintes perguntas:
Você precisa de uma lista sequencial em que o elemento normalmente será descartado após seu valor ser recuperado?
Em caso afirmativo, considere usar a classe Queue ou a classe genérica Queue<T> caso precise do comportamento PEPS (primeiro a entrar, primeiro a sair). Considere usar a classe Stack ou a classe genérica Stack<T> caso precise do comportamento UEPS (último a entrar, primeiro a sair). Para obter acesso seguro de vários threads, use as versões simultâneas ConcurrentQueue<T> e ConcurrentStack<T>. Para imutabilidade, considere as versões imutáveis ImmutableQueue<T> e ImmutableStack<T>.
Caso contrário, considere usar outras coleções.
Você precisa acessar os elementos em uma ordem específica, como PEPS, UEPS ou aleatória?
A classe Queue e as classes genéricas Queue<T>, ConcurrentQueue<T> e ImmutableQueue<T> oferecem acesso FIFO. Para obter mais informações, consulte Quando usar uma coleção thread-safe.
A classe Stack e as classes genéricas Stack<T>, ConcurrentStack<T> e ImmutableStack<T> oferecem acesso LIFO. Para obter mais informações, consulte Quando usar uma coleção thread-safe.
A classe genérica LinkedList<T> permite o acesso sequencial de ponta a ponta.
Você precisa acessar cada elemento pelo índice?
As classes ArrayList e StringCollection e a classe genérica List<T> oferecem acesso aos seus elementos pelo índice baseado em zero do elemento. Para imutabilidade, considere as versões genéricas imutáveis ImmutableArray<T> e ImmutableList<T>.
As classes Hashtable, SortedList, ListDictionary e StringDictionary, e as classes genéricas Dictionary<TKey,TValue> e SortedDictionary<TKey,TValue>, oferecem acesso aos seus elementos pela chave do elemento. Além disso, há versões imutáveis de vários tipos correspondentes: ImmutableHashSet<T>, ImmutableDictionary<TKey,TValue>, ImmutableSortedSet<T> e ImmutableSortedDictionary<TKey,TValue>.
As classes NameObjectCollectionBase e NameValueCollection, e as classes genéricas KeyedCollection<TKey,TItem> e SortedList<TKey,TValue>, oferecem acesso aos seus elementos pelo índice baseado em zero ou pela chave do elemento.
Cada elemento conterá um valor, uma combinação de uma chave e um valor ou uma combinação de uma chave e diversos valores?
Um valor: use qualquer uma das coleções baseadas na interface do IList ou na interface genérica do IList<T>. Para uma opção imutável, considere a interface genérica IImmutableList<T>.
Uma chave e um valor: use qualquer uma das coleções baseadas na interface do IDictionary ou na interface genérica do IDictionary<TKey,TValue>. Para uma opção imutável, considere a interface genérica IImmutableSet<T> ou IImmutableDictionary<TKey,TValue>.
Um valor com chave incorporada: use a classe genérica KeyedCollection<TKey,TItem>.
Uma chave e vários valores: use a classe NameValueCollection.
Você precisa classificar os elementos de forma diferente de como foram inseridos?
O Hashtable classifica os elementos dele pelos próprios códigos hash.
A classe SortedList e as classes genéricas SortedList<TKey,TValue> e SortedDictionary<TKey,TValue> classificam seus elementos pela chave. A ordem de classificação se baseia na implementação da interface IComparer da classe SortedList e na implementação da interface genérica IComparer<T> das classes genéricas SortedList<TKey,TValue> e SortedDictionary<TKey,TValue>. Dos dois tipos genéricos, SortedDictionary<TKey,TValue> oferece um melhor desempenho do que SortedList<TKey,TValue>, enquanto SortedList<TKey,TValue> consome menos memória.
O ArrayList oferece um método Sort que usa uma implementação IComparer como parâmetro. Seu equivalente genérico, a classe genérica List<T>, fornece um método Sort que usa uma implementação da interface genérica IComparer<T> como parâmetro.
Você precisa de rapidez para pesquisas e recuperação de informações?
- ListDictionary é mais rápido do que o Hashtable para pequenas coleções (10 itens ou menos). A classe genérica Dictionary<TKey,TValue> fornece pesquisa mais rápida do que a classe genérica SortedDictionary<TKey,TValue>. A implementação com multithread é ConcurrentDictionary<TKey,TValue>. O ConcurrentBag<T> fornece uma inserção com multithread rápida para dados não ordenados. Para obter mais informações sobre os dois tipos de multi-threaded, consulte Quando usar uma coleção thread-safe.
Você precisa de coleções que aceitem apenas cadeias de caracteres?
StringCollection (com base no IList) e StringDictionary (com base no IDictionary) estão no namespace System.Collections.Specialized.
Além disso, é possível usar qualquer uma das classes genéricas de coleção no namespace System.Collections.Generic como coleções de cadeias de caracteres fortemente tipadas especificando a classe String para seus argumentos de tipo genérico. Por exemplo, é possível declarar que uma variável é do tipo List<String> ou Dictionary<String,String>.
LINQ to Objects e PLINQ
O LINQ to Objects permite que os desenvolvedores usem consultas LINQ para acessar objetos na memória, desde que o tipo de objeto implemente IEnumerable ou 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. Para obter mais informações, confira LINQ to Objects (C#) e LINQ to Objects (Visual Basic).
PLINQ fornece uma implementação paralela de LINQ to Objects que pode oferecer uma execução de consulta mais rápida em muitos cenários, por meio do uso mais eficiente dos computadores de vários núcleos. Para obter mais informações, consulte PLINQ (Parallel LINQ).