Selecionando uma classe de coleção
Certifique-se de escolher sua classe de coleção com cuidado. Usar o tipo errado pode restringir o uso da coleção.
Importante
Evite usar os tipos no System.Collections namespace. As versões genérica e simultânea das coleções são recomendadas devido à sua maior segurança de tipo e outras melhorias.
Considere as perguntas seguintes:
Você precisa de uma lista sequencial onde o elemento normalmente é descartado depois que seu valor é recuperado?
Se sim, considere usar a Queue classe ou a Queue<T> classe genérica se precisar do comportamento FIFO (first-in, first-out). Considere usar a Stack classe ou a Stack<T> classe genérica se precisar do comportamento last-in, first-out (LIFO). Para acesso seguro a partir de vários threads, ConcurrentQueue<T> use as versões simultâneas e ConcurrentStack<T>. Para a imutabilidade, ImmutableQueue<T> considere as versões imutáveis e ImmutableStack<T>.
Caso contrário, considere usar as outras coleções.
Você precisa acessar os elementos em uma determinada ordem, como FIFO, LIFO ou aleatório?
A Queue classe, bem como as Queue<T>classes , ConcurrentQueue<T>, e ImmutableQueue<T> genéricas oferecem acesso FIFO. Para obter mais informações, consulte Quando usar uma coleção Thread-Safe.
A Stack classe, bem como as Stack<T>classes , ConcurrentStack<T>, e ImmutableStack<T> genéricas oferecem acesso LIFO. Para obter mais informações, consulte Quando usar uma coleção Thread-Safe.
A LinkedList<T> classe genérica permite o acesso sequencial da cabeça à cauda ou da cauda à cabeça.
Você precisa acessar cada elemento por índice?
As ArrayList classes e StringCollection e a List<T> classe genérica 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 Hashtableclasses , SortedList, ListDictionarye StringDictionary e as classes e SortedDictionary<TKey,TValue> genéricas Dictionary<TKey,TValue> oferecem acesso aos seus elementos pela chave do elemento. Além disso, existem versões imutáveis de vários tipos correspondentes: ImmutableHashSet<T>, ImmutableDictionary<TKey,TValue>, ImmutableSortedSet<T>, e ImmutableSortedDictionary<TKey,TValue>.
As NameObjectCollectionBase classes e NameValueCollection e as KeyedCollection<TKey,TItem> classes genéricas 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 vários valores?
Um valor: use qualquer uma das coleções baseadas na interface ou na IListIList<T> interface genérica. Para uma opção imutável, considere a IImmutableList<T> interface genérica.
Uma chave e um valor: use qualquer uma das coleções baseadas na interface ou na IDictionaryIDictionary<TKey,TValue> interface genérica. Para uma opção imutável, considere as IImmutableSet<T> interfaces ou IImmutableDictionary<TKey,TValue> genéricas.
Um valor com chave incorporada: Use a KeyedCollection<TKey,TItem> classe genérica.
Uma chave e vários valores: Use a NameValueCollection classe.
Você precisa classificar os elementos de forma diferente de como eles foram inseridos?
A Hashtable classe classifica seus elementos por seus códigos hash.
A SortedList classe e as SortedList<TKey,TValue> classes genéricas SortedDictionary<TKey,TValue> classificam seus elementos pela chave. A ordem de classificação é baseada na implementação da IComparer interface para a SortedList classe e na implementação da IComparer<T> interface genérica para as SortedList<TKey,TValue> classes e SortedDictionary<TKey,TValue> genéricas. Dos dois tipos genéricos, SortedDictionary<TKey,TValue> oferece melhor desempenho do que SortedList<TKey,TValue>, enquanto SortedList<TKey,TValue> consome menos memória.
ArrayList Fornece um Sort método que toma uma IComparer implementação como parâmetro. Sua contraparte genérica, a List<T> classe genérica, fornece um Sort método que usa uma implementação da IComparer<T> interface genérica como parâmetro.
Precisa de pesquisas rápidas e recuperação de informações?
- ListDictionary é mais rápido do que Hashtable para pequenas coleções (10 itens ou menos). A Dictionary<TKey,TValue> classe genérica fornece uma pesquisa mais rápida do que a SortedDictionary<TKey,TValue> classe genérica. A implementação multi-threaded é ConcurrentDictionary<TKey,TValue>. ConcurrentBag<T> Fornece inserção rápida multi-threaded para dados não ordenados. Para obter mais informações sobre ambos os tipos multi-threaded, consulte Quando usar uma coleção thread-safe.
Você precisa de coleções que aceitem apenas strings?
StringCollection (com base em IList) e StringDictionary (com base em IDictionary) estão no System.Collections.Specialized namespace.
Além disso, você pode usar qualquer uma das classes de coleção genéricas no System.Collections.Generic namespace como coleções de cadeia de caracteres fortemente tipadas especificando a String classe para seus argumentos de tipo genérico. Por exemplo, você pode declarar uma variável do tipo List<String> ou Dictionary<String,String>.
LINQ para Objetos 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, geralmente são mais concisas e legíveis do que os loops padrão foreach
e fornecem recursos de filtragem, ordenação e agrupamento. Para obter mais informações, consulte 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, através do uso mais eficiente de computadores multi-core. Para obter mais informações, consulte Parallel LINQ (PLINQ).