Dicionários em C#: por que são importantes e como trabalhar com eles?
Imagine que você é um bibliotecário. Você tem milhares de livros e precisa encontrar um específico em segundos. Você iria percorrer todos os livros em ordem? Não, você usaria um catálogo. O dicionário (Dictionary) em C# é exatamente esse catálogo. Ele armazena pares "chave-valor" e permite obter dados instantaneamente pela chave.
Mas o que fazer quando você não precisa encontrar um único registro, mas sim processar todo o conteúdo do dicionário? Por exemplo, exibir todas as configurações do aplicativo, calcular o total de um carrinho de compras online ou serializar dados em JSON. É aí que surge a clássica pergunta: "How to iterate over a dictionary?".
No Stack Overflow, essa pergunta acumulou milhares de visualizações. E não é à toa: parece simples, não? Mas iniciantes frequentemente tropeçam nos tipos de dados, e profissionais, no desempenho. Neste artigo, vamos abordar todas as formas de iterar sobre um dicionário em C#: desde o simples foreach até o avançado LINQ. Vamos lá!
1. Base: estrutura do Dictionary em C#
Antes de iterar, vamos lembrar como é um dicionário C#. É uma coleção genérica do namespace System.Collections.Generic.
Dictionary<string, int> ages = new Dictionary<string, int>(){ { "Ana", 25 }, { "Bruno", 30 }, { "Carlos", 35 }};Cada elemento do dicionário é uma estrutura KeyValuePair<TKey, TValue>. Ela tem duas propriedades: Key e Value. É com esse par que vamos trabalhar ao percorrer.
2. Clássico: foreach sobre o dicionário
A forma mais comum de iterar sobre um dicionário C# é o loop foreach. Ele é conciso, legível e seguro.
foreach (KeyValuePair<string, int> kvp in ages){ Console.WriteLine($"{kvp.Key}: {kvp.Value} anos");}Saída:
Ana: 25 anosBruno: 30 anosCarlos: 35 anosObserve: kvp é um KeyValuePair. Não tente modificar a chave ou o valor dentro do loop — o dicionário se tornará inconsistente e você receberá uma exceção InvalidOperationException.
Dica de profissional: Se tiver preguiça de escrever o tipo completo, use var:
foreach (var kvp in ages) { ... }3. Apenas chaves ou apenas valores
Às vezes, não precisamos do par completo. Por exemplo, precisamos apenas listar todas as chaves (nomes) ou todos os valores (idades). Para isso, o dicionário tem as propriedades Keys e Values.
Iteração sobre chaves
foreach (string name in ages.Keys){ Console.WriteLine($"Nome: {name}");}Iteração sobre valores
foreach (int age in ages.Values){ Console.WriteLine($"Idade: {age}");}Isso é mais rápido do que obter KeyValuePair, se você não precisar da segunda parte. Além disso, o código fica mais limpo.
4. Acesso por índice: for e ElementAt
Muitos iniciantes tentam usar for (int i = 0; i < dict.Count; i++). Mas Dictionary em C# não suporta indexador por número! Tentar escrever dict[i] resultará em erro de compilação.
No entanto, é possível contornar: obter a coleção de pares com .ToList() e acessar pelo índice.
var list = ages.ToList();for (int i = 0; i < list.Count; i++){ Console.WriteLine($"{list[i].Key}: {list[i].Value}");}Desvantagens:
- Cria uma cópia adicional dos dados (memória + tempo).
- Perde o sentido do dicionário como um array associativo.
Esse método só deve ser usado se você precisar vitalmente de um índice (por exemplo, para processamento paralelo com divisão em partes).