Understanding the C# Dictionary
A powerful data structure in C# that is often underutilized is the dictionary. Dictionary class is a generic collection found within the System.Collections dot Generic namespace. In his video, "The Dictionary Data Structure in C# in 10 Minutes or Less," Tim Corey provides a concise and practical guide on how to effectively use dictionaries in your C# applications. This article breaks down Tim's explanations and examples, with an aim to help you to grasp the essentials of the C# dictionary with ease.
Introduction to Dictionaries
Tim begins by introducing the concept of a dictionary in C#. He compares it to a real-life dictionary where you look up a word (key) to find its definition (value). In C#, a dictionary is a collection of key-value pairs where each key is unique and cannot be null.
Creating a Dictionary
A dictionary in C# is declared using the Dictionary<TKey, TValue> syntax, allowing for efficient data storage and retrieval through key-value pairs. With a default initial capacity set during its instantiation, dictionaries can dynamically adjust as elements are added.
At (0:28), Tim starts with a basic console application to demonstrate how to create a dictionary. He uses the following code to initialize a dictionary with integers as keys and strings as values:
Dictionary<int, string> rookieOfTheYear = new Dictionary<int, string>();
Dictionary<int, string> rookieOfTheYear = new Dictionary<int, string>();
Here, Dictionary<int, string> specifies that the keys will be integers (int) and the values will be strings (string). The variable rookieOfTheYear is the name of the dictionary instance. You can also use string keys with the key type as string.
Adding Elements to a Dictionary
Tim now adds elements to the dictionary at (2:08). He shows how to use the Add method to add key-value pairs:
rookieOfTheYear.Add(2000, "Mike Miller");
rookieOfTheYear.Add(2001, "Jane Doe");
rookieOfTheYear.Add(2002, "Jane Doe");
rookieOfTheYear.Add(2003, "John Smith");
rookieOfTheYear.Add(2000, "Mike Miller");
rookieOfTheYear.Add(2001, "Jane Doe");
rookieOfTheYear.Add(2002, "Jane Doe");
rookieOfTheYear.Add(2003, "John Smith");
In this example:
rookieOfTheYear.Add(2000, "Mike Miller") adds the specified key 2000 with the value "Mike Miller".
- Similarly, keys 2001, 2002 and 2003 are associated with "Jane Doe", "Jane Doe" and "John Smith" respectively.
He notes that while values can be repeated, keys must be unique. Attempting to add a duplicate key results in an exception:
rookieOfTheYear.Add(2001, "Jane Doe"); // This will throw an exception
rookieOfTheYear.Add(2001, "Jane Doe"); // This will throw an exception
This exception occurs because the key 2001 already exists in the dictionary.
Accessing Dictionary Elements
To demonstrate value retrieval, Tim uses the following line of code at (3:45):
Console.WriteLine(rookieOfTheYear[2002]); // Outputs: Jane Doe
Console.WriteLine(rookieOfTheYear[2002]); // Outputs: Jane Doe
Here, rookieOfTheYear[2002] accesses the value associated with the key 2002. This is a very efficient way to look up values based on keys.
Checking for Key Existence
At (4:29), Tim discusses how to check if a key exists in the dictionary using the ContainsKey method:
if (rookieOfTheYear.ContainsKey(2002))
{
Console.WriteLine(rookieOfTheYear[2002]);
}
if (rookieOfTheYear.ContainsKey(2002))
{
Console.WriteLine(rookieOfTheYear[2002]);
}
In above example, ContainsKey(2002) checks if the key 2002 exists in the dictionary. If it does, the corresponding value ("Jane Doe") is printed.
If the key does not exist, the dictionary returns no output, preventing errors from accessing non-existent keys.
Expanding Dictionary Capabilities
Tim expands on dictionary capabilities at (5:33), creating a more complex example with a dictionary that maps strings to lists of strings:
Dictionary<string, List<string>> wishList = new();
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" });
Dictionary<string, List<string>> wishList = new();
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" });
Here:
The keys are strings (e.g., "Tim Corey", "Billy Bob", "Mary Jane").
- The values are lists of strings, representing a wish list for each person.
Iterating Over a Dictionary
At (7:24), Tim demonstrates how to iterate over a dictionary using a foreach loop:
foreach (var (key, value) in wishList)
{
Console.WriteLine($"{key}'s wish list:");
foreach (var item in value)
{
Console.WriteLine($"\t{item}");
}
}
foreach (var (key, value) in wishList)
{
Console.WriteLine($"{key}'s wish list:");
foreach (var item in value)
{
Console.WriteLine($"\t{item}");
}
}
In this example:
foreach (var (key, value) in wishList) iterates over each key-value pair in the wishList dictionary.
key refers to the key (e.g., "Tim Corey").
value refers to the list of values associated with that key.
- The inner loop iterates over each item in the list and prints it.
This allows for printing all the elements using a loop to access dictionary elements one by one with a specified key and it's corresponding specified value. Here is the output: (Better Image Possible)
Accessing More Complex Values
Tim also shows how to access more complex values in the dictionary by explicitly using the specified index at (8:26):
Console.WriteLine(wishList["Tim Corey"][0]); // Outputs: Xbox
Console.WriteLine(wishList["Tim Corey"][0]); // Outputs: Xbox
Here, wishList["Tim Corey"] accesses the list associated with the key "Tim Corey", and [0] retrieves the first item in that list.
Conclusion
Tim concludes at (9:00) by emphasizing the importance of understanding dictionaries. He points out that while dictionaries may not be used frequently, they are incredibly useful for scenarios requiring unique keys and efficient lookups.
Key Takeaways
Creating Dictionaries: Understand how to initialize dictionaries with various data types.
Adding Elements: Learn the importance of unique keys and how to handle duplicate key exceptions.
Accessing Values: Efficiently retrieve values using keys.
Checking Key Existence: Prevent errors by checking for key existence before accessing values.
Advanced Usage: Implement more complex dictionaries, such as those with lists as values.
- Iteration: Use loops to access and display all elements in a dictionary.
By following Tim Corey's video, you can master the use of dictionaries in C#, enhancing your programming toolkit for scenarios requiring efficient data retrieval and storage. Check out Tim's channel for more informative videos on C#.