Zrozumienie słownika w C#
Potężna struktura danych w C#, która jest często niedoceniana, to słownik. Klasa Dictionary jest ogólną kolekcją znajdującą się w przestrzeni nazw System.Collections.Generic. W swoim filmie, "The Dictionary Data Structure in C# in 10 Minutes or Less", Tim Corey dostarcza zwięzły i praktyczny przewodnik po tym, jak skutecznie używać słowników w aplikacjach C#. Ten artykuł przedstawia wyjaśnienia i przykłady Tima, mając na celu pomóc Ci łatwo zrozumieć podstawy słownika w C#.
Wprowadzenie do słowników
Tim zaczyna od przedstawienia pojęcia słownika w C#. Porównuje go do prawdziwego słownika, w którym wyszukujesz słowo (klucz), aby znaleźć jego definicję (wartość). W C#, słownik jest kolekcją par klucz-wartość, gdzie każdy klucz jest unikatowy i nie może być null.
Tworzenie słownika
Słownik w C# jest deklarowany za pomocą składni Dictionary<TKey, TValue>, co pozwala na efektywne przechowywanie i pobieranie danych poprzez pary klucz-wartość. Dzięki domyślnej pojemności początkowej ustawianej podczas jego tworzenia, słowniki mogą dynamicznie dostosowywać się, gdy dodawane są nowe elementy.
O (0:28), Tim zaczyna od podstawowej aplikacji konsolowej, aby pokazać, jak stworzyć słownik. Używa następującego kodu, aby zainicjalizować słownik z liczbami całkowitymi jako kluczami i ciągami jako wartościami:
// 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>();
Tutaj Dictionary<int, string> określa, że klucze będą liczbami całkowitymi (int), a wartości będą ciągami (string). Zmienna rookieOfTheYear jest nazwą instancji słownika. Możesz również użyć kluczy tekstowych, ustawiając typ klucza jako string.
Dodawanie elementów do słownika
Teraz Tim dodaje elementy do słownika o (2:08). Pokazuje, jak używać metody Add do dodawania par klucz-wartość:
// 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");
W tym przykładzie:
-
rookieOfTheYear.Add(2000, "Mike Miller")dodaje określony klucz2000z wartością"Mike Miller". - Podobnie, klucze
2001,2002i2003są powiązane z"Jane Doe","Jane Doe"i"John Smith"odpowiednio.
Zaznacza, że podczas gdy wartości mogą się powtarzać, klucze muszą być unikatowe. Próba dodania duplikatu klucza prowadzi do wyjątku:
rookieOfTheYear.Add(2001, "Jane Doe"); // This will throw an exception
rookieOfTheYear.Add(2001, "Jane Doe"); // This will throw an exception
Ten wyjątek występuje, ponieważ klucz 2001 już istnieje w słowniku.
Uzyskiwanie dostępu do elementów słownika
Aby zademonstrować pobieranie wartości, Tim używa następującej linii kodu o (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
Tutaj rookieOfTheYear[2002] uzyskuje dostęp do wartości powiązanej z kluczem 2002. Jest to bardzo wydajny sposób na wyszukiwanie wartości na podstawie kluczy.

Sprawdzanie obecności klucza
O (4:29), Tim omawia, jak sprawdzić, czy klucz istnieje w słowniku, używając metody 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]);
}
W powyższym przykładzie, ContainsKey(2002) sprawdza, czy klucz 2002 istnieje w słowniku. Jeśli tak, drukowana jest odpowiadająca wartość ("Jane Doe").
Jeśli klucz nie istnieje, słownik nie zwraca żadnej wartości, co zapobiega błędom związanym z dostępem do nieistniejących kluczy.
Rozszerzanie możliwości słownika
Tim rozszerza możliwości słownika o (5:33), tworząc bardziej złożony przykład ze słownikiem, który mapuje ciągi na listy ciągów:
// 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" });
Tutaj:
-
Klucze są ciągami (np. "Tim Corey", "Billy Bob", "Mary Jane").
- Wartości są listami ciągów, reprezentującymi listę życzeń dla każdej osoby.
Iterowanie po słowniku
O (7:24), Tim demonstruje, jak iterować po słowniku, używając pętli 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}");
}
}
W tym przykładzie:
-
foreach (var (key, value) in wishList)iteruje po każdej parze klucz-wartość w słownikuwishList. -
keyodnosi się do klucza (np. "Tim Corey"). -
valueodnosi się do listy wartości powiązanej z tym kluczem. - Wewnętrzna pętla iteruje po każdym elemencie w liście i drukuje go.
Pozwala to na drukowanie wszystkich elementów za pomocą pętli do uzyskiwania dostępu do elementów słownika jeden po drugim przy użyciu określonego klucza i odpowiadającej mu wartości. Oto wynik:

Uzyskiwanie dostępu do bardziej złożonych wartości
Tim pokazuje również, jak uzyskiwać dostęp do bardziej złożonych wartości w słowniku, wyraźnie używając określonego indeksu o (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
Tutaj, wishList["Tim Corey"] uzyskuje dostęp do listy powiązanej z kluczem "Tim Corey", a [0] pobiera pierwszy element z tej listy.
Wnioski
Tim kończy o (9:00), podkreślając znaczenie rozumienia słowników. Wskazuje, że mimo iż słowniki mogą nie być używane często, są niezwykle przydatne w scenariuszach wymagających unikatowych kluczy i wydajnych wyszukiwań.
Najważniejsze wnioski
-
Tworzenie słowników: Zrozum, jak inicjalizować słowniki z różnymi typami danych.
-
Dodawanie elementów: Zrozum znaczenie unikatowych kluczy i jak obsługiwać wyjątki wynikające z duplikatów kluczy.
-
Uzyskiwanie dostępu do wartości: Efektywnie pobieraj wartości, używając kluczy.
-
Sprawdzanie istnienia kluczy: Zapobiegaj błędom, sprawdzając istnienie kluczy przed uzyskaniem dostępu do wartości.
-
Zaawansowane użycie: Implementuj bardziej złożone słowniki, takie jak te z listami jako wartościami.
- Iteracja: Używaj pętli do uzyskiwania dostępu do wszystkich elementów w słowniku i ich wyświetlania.
Śledząc wideo Tima Coreya, możesz opanować użycie słowników w C#, wzbogacając swój zestaw narzędzi programistycznych o scenariusze wymagające wydajnego pobierania i przechowywania danych. Sprawdź kanał Tima dla bardziej informacyjnych filmów o C#.

