List, Dictionary e HashSet
Resumo
List<T>guarda itens em ordem;Dictionary<K,V>mapeia chave→valor com busca rápida;HashSet<T>guarda itens únicos. Escolher a coleção certa muda clareza e desempenho.
1. Objetivos de Aprendizagem#
- Usar as três coleções mais comuns do .NET.
- Escolher a estrutura adequada ao problema.
- Conhecer o custo de operações típicas.
2. Pré-requisitos#
- Classes e interfaces (Módulo 05).
3. Conceito#
List<T>: sequência ordenada e indexável. Adicionar ao fim é rápido; buscar por conteúdo percorre a lista.Dictionary<TKey,TValue>: tabela hash chave→valor. Busca/inserção por chave são muito rápidas (tempo praticamente constante), mas sem ordem garantida.HashSet<T>: conjunto de itens únicos, com verificação de pertencimento rápida.
O porquê de escolher bem: usar List para buscas por chave frequentes vira gargalo; um Dictionary resolve em uma linha.
4. Mão na Massa#
4.1. Setup#
dotnet new console -n Catalog.Colecoes
cd Catalog.Colecoes
4.2. Implementação Passo a Passo#
List<T>:
var produtos = new List<string> { "Mouse", "Teclado" };
produtos.Add("Monitor");
produtos.RemoveAt(0);
Console.WriteLine(produtos.Count); // 2
Console.WriteLine(produtos[0]); // "Teclado"
Dictionary<K,V>:
var precos = new Dictionary<string, decimal>
{
["Mouse"] = 90m,
["Teclado"] = 120m
};
if (precos.TryGetValue("Mouse", out var preco))
Console.WriteLine(preco); // 90
precos["Monitor"] = 1200m; // adiciona/atualiza
HashSet<T>:
var tags = new HashSet<string> { "novo", "promo" };
Console.WriteLine(tags.Add("novo")); // False (já existe)
Console.WriteLine(tags.Contains("promo")); // True
4.3. Executando#
dotnet run
5. Exemplo Completo#
Para consultar preços por nome de produto, Dictionary<string, decimal> com TryGetValue é a escolha idiomática — evita percorrer uma lista a cada consulta.
6. Boas Práticas e Armadilhas#
| Faça | Evite |
|---|---|
Dictionary para busca por chave | Percorrer List repetidamente procurando por chave |
TryGetValue para acesso seguro | Acessar dict[chave] inexistente (lança KeyNotFoundException) |
HashSet para unicidade e pertencimento | List.Contains em coleções grandes (lento) |
Atenção
DictionaryeHashSetnão garantem ordem de iteração. Se precisar de ordem, useListou ordene explicitamente.
7. Segurança e Produção#
- As coleções padrão não são thread-safe. Para acesso concorrente, use
System.Collections.Concurrent(ex.:ConcurrentDictionary).
8. Exercícios#
- Fácil: monte uma
Listde nomes e imprima cada um. - Médio: use um
Dictionarypara contar ocorrências de palavras. - Desafio: dado duas listas, use
HashSetpara achar os itens em comum.
9. Resumo#
List<T> (ordem/índice), Dictionary<K,V> (busca por chave), HashSet<T> (unicidade). Escolha pela operação dominante; use TryGetValue e lembre-se de que não são thread-safe.
10. Próximos Passos#
A seguir, o mecanismo por trás delas: generics.
11. Referências#
- Microsoft Learn — Tipos de coleção comuns
- Microsoft Learn — Dictionary<TKey,TValue>
- Microsoft Learn — Coleções thread-safe