Escolhendo uma coleção
Compromissos e desempenho.
Escolhendo uma coleção é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.
Primeiro, uma pergunta
Escolher uma coleção começa com uma pergunta: como você acessará os dados? Por posição, por chave ou apenas verificando o pertencimento?
List, Dictionary e HashSet respondem, cada um, a um padrão de acesso diferente. Combine a ferramenta com o padrão para manter seu código rápido e claro.
Acesso por posição: lista
Se a ordem for importante e você acessar os itens por índice, escolha List<T>. Ela mantém a ordem de inserção e oferece indexação O(1).
Exemplos: uma fila de steps, linhas na ordem de exibição ou qualquer sequência que você percorra do início ao fim. Duplicatas são permitidas.
var steps = new List<string> { "mix", "bake", "cool" };
string first = steps[0]; // O(1) by indexAcesso por chave: dicionário
Se você pesquisar itens por um identificador exclusivo, escolha Dictionary<K,V>. Ele mapeia uma chave para um valor em O(1) em média.
Exemplos: id de usuário para usuário, código de país para nome e palavra para sua contagem. A chave responde a «qual deles»; o valor transporta os dados.
var users = new Dictionary<int, string> {
[101] = "Ann",
[102] = "Bob"
};
string name = users[101];Pertencimento e exclusividade: HashSet
Se você só precisa saber se um valor está presente ou precisa rejeitar duplicatas, escolha HashSet<T>. Contains tem custo O(1) em média.
Exemplos: visited URLs, permissões permitidas e tags distintas. Não há um valor associado, apenas a presença do elemento.
var visited = new HashSet<string>();
if (visited.Add(url)) {
// first time seeing this url
}A tabela de custos
Custos médios: a indexação de uma List custa O(1), mas Contains custa O(n). A pesquisa em um Dictionary e em um HashSet custa O(1).
List.Add no final custa O(1) amortizado; inserir ou remover no meio custa O(n). Adicionar e remover em um dicionário e em um HashSet custa O(1) em média.
// List: index O(1), Contains O(n)
// Dictionary: by-key O(1), no index
// HashSet: Contains O(1), no value, no indexContains em uma lista é um sinal de alerta
Chamar repetidamente list.Contains dentro de um laço é uma armadilha O(n ao quadrado). Cada verificação percorre a lista inteira.
Se as verificações de pertencimento predominarem, troque para um HashSet. Essa única mudança pode transformar um laço lento em um instantâneo com dados grandes.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var allow = new HashSet<int> { 2, 4, 6 };
foreach (int n in new[] { 1, 2, 3, 4 })
if (allow.Contains(n)) Console.Write(n + " ");
}
}Quando você precisa de chave e ordem
Precisa de uma pesquisa por chave, mas também de uma ordem previsível? O Dictionary padrão não garante uma ordem.
Considere manter uma lista para a ordem junto de um dicionário para a pesquisa, ou use SortedDictionary<K,V> para manter as chaves em ordem sorted, ao custo de O(log n).
var sorted = new SortedDictionary<string, int>();
sorted["b"] = 2;
sorted["a"] = 1;
// enumerates a then b, in key orderCompromissos de memória
Coleções baseadas em dispersão trocam memória por velocidade. Dictionary e HashSet mantêm compartimentos internos, usando mais memória do que uma List compacta ou uma matriz.
Para coleções pequenas, com poucos itens, percorrer uma List pode ser perfeitamente adequado e usar menos memória. A dispersão compensa em grande escala.
Program para interfaces
As assinaturas de métodos devem solicitar o tipo menos específico que funcione. Aceite IEnumerable<T> para leitura, IReadOnlyList<T> para leituras indexadas e IDictionary<K,V> para acesso por chave.
Isso desacopla os chamadores da sua escolha concreta, permitindo trocar implementações mais tarde sem quebrar as assinaturas.
int Sum(IEnumerable<int> values) {
int total = 0;
foreach (int v in values) total += v;
return total;
}Um exemplo prático
Contar palavras unique em um texto usa duas coleções juntas. Um HashSet acompanha palavras seen; um dicionário contabiliza as ocorrências.
Cada um faz uma tarefa bem: o set garante exclusividade, o dicionário mapeia a palavra para sua frequência, e ambos oferecem custo O(1) em média por operação.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var counts = new Dictionary<string, int>();
foreach (var w in "a b a c b a".Split(' '))
counts[w] = counts.GetValueOrDefault(w) + 1;
Console.WriteLine(counts["a"]); // 3
}
}Lista de verificação para decisão
Pergunte na ordem: preciso de um mapa de chave para valor? Use um dicionário. Preciso apenas de exclusividade ou pertencimento? Use um HashSet.
Caso contrário, preciso de ordem e acesso por índice, possivelmente com duplicatas? Use uma lista. Esta breve lista de verificação cobre a maioria dos casos cotidianos.
Verificação rápida
Aplique a lista de verificação para decisão a uma necessidade concreta.
Recapitulação
Escolha pelo padrão de acesso: List para sequências ordenadas e indexadas; Dictionary para pesquisas de chave para valor; HashSet para exclusividade e pertencimento.
Observe a complexidade: evite List.Contains em laços críticos, aproveite pesquisas por dispersão O(1) e programe para interfaces para manter sua escolha flexível.
Aprenda C# com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 93
- Aulas
- 346
Perguntas Frequentes
A aula “Escolhendo uma coleção” é grátis?
Sim — o texto completo de “Escolhendo uma coleção” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.
O que vou aprender em “Escolhendo uma coleção”?
Compromissos e desempenho. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Escolhendo uma coleção”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- List na prática
- Pesquisas em dicionários
- HashSet e exclusividade
- Escolhendo uma coleção