Entendendo o dicionário C#
Uma estrutura de dados poderosa em C# que muitas vezes é subutilizada é o dicionário. A classe Dictionary é uma coleção genérica encontrada no namespace System.Collections.Generic. Em seu vídeo " A estrutura de dados Dictionary em C# em 10 minutos ou menos ", Tim Corey oferece um guia conciso e prático sobre como usar dicionários de forma eficaz em suas aplicações C#. Este artigo detalha as explicações e exemplos de Tim, com o objetivo de ajudá-lo a compreender os fundamentos do dicionário C# com facilidade.
Introdução aos dicionários
Tim começa apresentando o conceito de dicionário em C#. Ele compara isso a um dicionário da vida real, onde você procura uma palavra (chave) para encontrar sua definição (valor). Em C#, um dicionário é uma coleção de pares chave-valor onde cada chave é única e não pode ser nula.
Criando um dicionário
Um dicionário em C# é declarado usando a sintaxe Dictionary<TKey, TValue>, permitindo o armazenamento e a recuperação eficiente de dados através de pares chave-valor. Com uma capacidade inicial padrão definida durante sua criação, os dicionários podem se ajustar dinamicamente à medida que elementos são adicionados.
Em (0:28), Tim começa com um aplicativo de console básico para demonstrar como criar um dicionário. Ele usa o seguinte código para inicializar um dicionário com números inteiros como chaves e strings como valores:
// Declare a dictionary with integer keys and string values
Dictionary<int, string> rookieOfTheYear = new Dictionary<int, string>();
// Declare a dictionary with integer keys and string values
Dictionary<int, string> rookieOfTheYear = new Dictionary<int, string>();
Aqui, Dictionary<int, string> especifica que as chaves serão inteiros (int) e os valores serão strings (string). A variável rookieOfTheYear é o nome da instância do dicionário. Você também pode usar chaves de string configurando o tipo de chave como string.
Adicionando elementos a um dicionário
Tim agora adiciona elementos ao dicionário em (2:08). Ele mostra como usar o método Add para adicionar pares chave-valor:
// Add entries to the dictionary
rookieOfTheYear.Add(2000, "Mike Miller");
rookieOfTheYear.Add(2001, "Jane Doe");
rookieOfTheYear.Add(2002, "Jane Doe");
rookieOfTheYear.Add(2003, "John Smith");
// Add entries to the dictionary
rookieOfTheYear.Add(2000, "Mike Miller");
rookieOfTheYear.Add(2001, "Jane Doe");
rookieOfTheYear.Add(2002, "Jane Doe");
rookieOfTheYear.Add(2003, "John Smith");
Neste exemplo:
-
rookieOfTheYear.Add(2000, "Mike Miller")adiciona a chave especificada2000com o valor"Mike Miller". - Da mesma forma, as chaves
2001,2002e2003estão associadas a"Jane Doe","Jane Doe"e"John Smith"respectivamente.
Ele observa que, embora os valores possam ser repetidos, as chaves devem ser únicas. A tentativa de adicionar uma chave duplicada resulta em uma exceção:
rookieOfTheYear.Add(2001, "Jane Doe"); // This will throw an exception
rookieOfTheYear.Add(2001, "Jane Doe"); // This will throw an exception
Esta exceção ocorre porque a chave 2001 já existe no dicionário.
Acessando elementos do dicionário
Para demonstrar a recuperação de valores, Tim usa a seguinte linha de código em (3:45):
// Accessing a value with a specific key
Console.WriteLine(rookieOfTheYear[2002]); // Outputs: Jane Doe
// Accessing a value with a specific key
Console.WriteLine(rookieOfTheYear[2002]); // Outputs: Jane Doe
Aqui, rookieOfTheYear[2002] acessa o valor associado à chave 2002. Essa é uma maneira muito eficiente de buscar valores com base em chaves.

Verificação da existência da chave
Às (4:29), Tim discute como verificar se uma chave existe no dicionário usando o método ContainsKey:
// Check if a key exists before accessing its value
if (rookieOfTheYear.ContainsKey(2002))
{
Console.WriteLine(rookieOfTheYear[2002]);
}
// Check if a key exists before accessing its value
if (rookieOfTheYear.ContainsKey(2002))
{
Console.WriteLine(rookieOfTheYear[2002]);
}
No exemplo acima, ContainsKey(2002) verifica se a chave 2002 existe no dicionário. Se existir, o valor correspondente ("Jane Doe") é impresso.
Se a chave não existir, o dicionário não retorna nenhum resultado, evitando erros ao acessar chaves inexistentes.
Ampliando as capacidades do dicionário
Tim aprofunda as funcionalidades do dicionário em (5:33), criando um exemplo mais complexo com um dicionário que mapeia strings para listas de strings:
// Declare a dictionary with string keys and List<string> as values
Dictionary<string, List<string>> wishList = new();
// Add entries to the dictionary with lists as values
wishList.Add("Tim Corey", new List<string> { "Xbox", "Tesla", "Pizza" });
wishList.Add("Billy Bob", new List<string> { "PS5", "Ford", "Hoagie" });
wishList.Add("Mary Jane", new List<string> { "House", "Car", "Sub" });
// Declare a dictionary with string keys and List<string> as values
Dictionary<string, List<string>> wishList = new();
// Add entries to the dictionary with lists as values
wishList.Add("Tim Corey", new List<string> { "Xbox", "Tesla", "Pizza" });
wishList.Add("Billy Bob", new List<string> { "PS5", "Ford", "Hoagie" });
wishList.Add("Mary Jane", new List<string> { "House", "Car", "Sub" });
Aqui:
-
As teclas são sequências de caracteres (ex.: "Tim Corey", "Billy Bob", "Mary Jane").
- Os valores são listas de strings, representando uma lista de desejos para cada pessoa.
Iterando sobre um dicionário
Às (7:24), Tim demonstra como iterar sobre um dicionário usando um loop foreach:
// Iterate over each key-value pair in the dictionary
foreach (var (key, value) in wishList)
{
Console.WriteLine($"{key}'s wish list:");
// Iterate over each item in the list of values
foreach (var item in value)
{
Console.WriteLine($"\t{item}");
}
}
// Iterate over each key-value pair in the dictionary
foreach (var (key, value) in wishList)
{
Console.WriteLine($"{key}'s wish list:");
// Iterate over each item in the list of values
foreach (var item in value)
{
Console.WriteLine($"\t{item}");
}
}
Neste exemplo:
-
foreach (var (key, value) in wishList)itera sobre cada par chave-valor no dicionáriowishList. -
keyrefere-se à chave (por exemplo, "Tim Corey"). -
valuerefere-se à lista de valores associada a essa chave. - O laço interno itera sobre cada item da lista e o imprime.
Isso permite imprimir todos os elementos usando um loop para acessar os elementos do dicionário um por um, com uma chave específica e seu respectivo valor também específico. Aqui está o resultado:

Acessando valores mais complexos
Tim também mostra como acessar valores mais complexos no dicionário usando explicitamente o índice especificado em (8:26):
// Access the first item in the list of values for the specified key
Console.WriteLine(wishList["Tim Corey"][0]); // Outputs: Xbox
// Access the first item in the list of values for the specified key
Console.WriteLine(wishList["Tim Corey"][0]); // Outputs: Xbox
Aqui, wishList["Tim Corey"] acessa a lista associada à chave "Tim Corey", e [0] recupera o primeiro item dessa lista.
Conclusão
Tim conclui em (9:00) enfatizando a importância de compreender os dicionários. Ele destaca que, embora os dicionários possam não ser usados com frequência, são incrivelmente úteis em cenários que exigem chaves exclusivas e pesquisas eficientes.
Principais conclusões
-
Criação de dicionários: Compreenda como inicializar dicionários com vários tipos de dados.
-
Adicionando Elementos: Aprenda a importância de chaves únicas e como lidar com exceções de chaves duplicadas.
-
Acesso a valores: Recupere valores de forma eficiente usando chaves.
-
Verificação da existência da chave: Evite erros verificando a existência da chave antes de acessar os valores.
-
Uso avançado: Implemente dicionários mais complexos, como aqueles com listas como valores.
- Iteração: Utilize loops para acessar e exibir todos os elementos de um dicionário.
Seguindo o vídeo de Tim Corey, você poderá dominar o uso de dicionários em C#, aprimorando seu conjunto de ferramentas de programação para cenários que exigem recuperação e armazenamento de dados eficientes. Confira o canal do Tim para mais vídeos informativos sobre C#.

