0Pricing
C# Academy · Aula

Pesquisas em dicionários

Acesso rápido a pares de chave e valor.

Pesquisas em dicionários é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 2 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.

Pares de chave e valor

Dictionary<TKey, TValue> associa chaves exclusivas a valores. Pense nele como uma tabela de consulta: forneça uma chave e obtenha o valor correspondente rapidamente.

Ele usa uma tabela de dispersão, portanto encontrar um valor pela chave custa, em média, O(1), muito mais rápido do que percorrer uma lista.

using System.Collections.Generic;

var ages = new Dictionary<string, int>();
ages["Ann"] = 30;
ages["Bob"] = 25;

Inicializando um dicionário

Você pode preencher um dicionário com um inicializador de coleção. Cada entrada associa uma chave ao seu valor.

As chaves devem ser únicas. Fornecer a mesma chave duas vezes em um inicializador lança uma ArgumentException em tempo de execução.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var caps = new Dictionary<string, string> {
            ["FR"] = "Paris",
            ["JP"] = "Tokyo"
        };
        Console.WriteLine(caps["JP"]);
    }
}

Leitura por chave

Use o indexador para ler: dict[key]. Isso é O(1) em média.

Mas tenha cuidado: se a chave estiver ausente, o indexador lança KeyNotFoundException. Ler uma chave ausente é um dos erros mais comuns com dicionários.

var ages = new Dictionary<string, int> { ["Ann"] = 30 };
int a = ages["Ann"];      // 30
// int b = ages["Zoe"];   // throws KeyNotFoundException

Pesquisa segura com TryGetValue

TryGetValue evita exceções. Ele retorna true e define uma variável out quando a chave existe, ou false caso contrário.

Essa é a forma idiomática e sem alocações de pesquisar um valor sobre o qual não tem certeza.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var ages = new Dictionary<string, int> { ["Ann"] = 30 };
        if (ages.TryGetValue("Ann", out int v))
            Console.WriteLine(v);
    }
}

ContainsKey e valores padrão

ContainsKey verifica se uma chave existe sem ler o valor, em O(1). Use-o antes de uma leitura pelo indexador quando precisar apenas de uma resposta afirmativa ou negativa.

Se chamar ContainsKey e o indexador, calculará o hash da chave duas vezes. TryGetValue faz isso uma vez, por isso geralmente é mais rápido.

var ages = new Dictionary<string, int> { ["Ann"] = 30 };
if (ages.ContainsKey("Ann"))
    System.Console.WriteLine(ages["Ann"]);

Adicionar versus atribuir

O indexador dict[key] = value insere um novo par ou substitui um já existente. Add(key, value) apenas insere, lançando uma exceção se a chave já existir.

Use Add quando uma chave duplicada deve ser um erro, e o indexador quando a substituição for aceitável.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var d = new Dictionary<string, int>();
        d["x"] = 1;
        d["x"] = 2;     // overwrite, fine
        Console.WriteLine(d["x"]);
    }
}

Remover entradas

Remove(key) exclui um par e retorna true se a chave estava presente, em média O(1).

Uma sobrecarga retorna o valor removido por meio de um parâmetro out, o que é útil quando você quer excluir e usar o valor em uma única etapa.

var d = new Dictionary<string, int> { ["a"] = 1, ["b"] = 2 };
bool removed = d.Remove("a");   // true
bool again = d.Remove("a");     // false

Iterar sobre pares

Um laço produz itens KeyValuePair<TKey, TValue>. Desestruture-os em uma chave e um valor para obter um código limpo.

A ordem de enumeração não é garantida; nunca dependa da ordem em que as entradas foram inseridas. Use Keys ou Values para iterar apenas sobre um dos lados.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var d = new Dictionary<string, int> { ["a"] = 1, ["b"] = 2 };
        foreach (var (key, val) in d)
            Console.WriteLine($"{key}={val}");
    }
}

Contagem com um dicionário

Um uso clássico é contar ocorrências. Para cada item, incremente sua contagem, começando em zero se ele for novo.

Esse padrão é executado em O(n) para n itens porque cada pesquisa e atualização é O(1), em vez de O(n ao quadrado) se você percorresse uma lista a cada vez.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var counts = new Dictionary<char, int>();
        foreach (char c in "banana")
            counts[c] = counts.GetValueOrDefault(c) + 1;
        Console.WriteLine(counts['a']);
    }
}

A igualdade das chaves é importante

As pesquisas dependem de GetHashCode e Equals do tipo da chave. Tipos integrados e string funcionam imediatamente.

Para chaves de classes personalizadas, substitua ambos os métodos ou use um record; caso contrário, duas chaves visualmente iguais produzirão códigos de dispersão diferentes e as pesquisas falharão.

var byName = new Dictionary<string, int>(
    System.StringComparer.OrdinalIgnoreCase);
byName["Hi"] = 1;
bool found = byName.ContainsKey("HI"); // true

Escolher um tipo de valor

Os valores podem ser qualquer coisa, incluindo listas. Um Dictionary<string, List<int>> agrupa muitos valores sob uma única chave.

Ao inserir nessa estrutura, crie a lista interna na primeira utilização e depois adicione o valor a ela. Isso cria um mapa agrupado de múltiplos valores.

var groups = new Dictionary<string, List<int>>();
void Add(string k, int v) {
    if (!groups.TryGetValue(k, out var list))
        groups[k] = list = new List<int>();
    list.Add(v);
}

Verificação rápida

Escolha a forma mais segura de ler uma chave possivelmente ausente.

Recapitulação

Dictionary<K,V> oferece pesquisa, inserção e remoção por chave em O(1) em média, com suporte de uma tabela de dispersão.

Prefira TryGetValue ao indexador que lança uma exceção, mantenha as chaves unique e certifique-se de que os tipos de chave personalizados implementem igualdade e dispersão adequadas. A ordem de iteração é indefinida.

Perguntas Frequentes

A aula “Pesquisas em dicionários” é grátis?

Sim — o texto completo de “Pesquisas em dicionários” é 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 “Pesquisas em dicionários”?

Acesso rápido a pares de chave e valor. 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 2 de 4.

Quanto tempo leva a aula “Pesquisas em dicionários”?

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

  1. List na prática
  2. Pesquisas em dicionários
  3. HashSet e exclusividade
  4. Escolhendo uma coleção
← Voltar para C# Academy