Dictionary-lookups
Snelle toegang via sleutel en waarde.
Dictionary-lookups is een gratis C# Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C# Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C# Academy bevat in totaal 4 lessen.
Sleutel-waardeparen
Dictionary<TKey, TValue> koppelt unieke sleutels aan waarden. Zie het als een opzoektabel: geef een sleutel op en krijg snel de bijbehorende waarde terug.
De dictionary is gebaseerd op een hashtabel, dus een waarde opzoeken via een sleutel kost gemiddeld O(1), veel sneller dan een lijst doorzoeken.
using System.Collections.Generic;
var ages = new Dictionary<string, int>();
ages["Ann"] = 30;
ages["Bob"] = 25;Een Dictionary initialiseren
Je kunt een dictionary vullen met een initialisatieblok voor een verzameling. Elke invoer koppelt een sleutel aan zijn waarde.
Sleutels moeten uniek zijn. Als je dezelfde sleutel twee keer in een initialisatieblok opgeeft, veroorzaakt dat tijdens de uitvoering een ArgumentException.
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"]);
}
}Lezen op sleutel
Gebruik de indexer om te lezen: dict[key]. Dit is gemiddeld O(1).
Let wel op: als de sleutel ontbreekt, gooit de indexer KeyNotFoundException. Een ontbrekende sleutel lezen is een van de meest voorkomende fouten bij woordenboeken.
var ages = new Dictionary<string, int> { ["Ann"] = 30 };
int a = ages["Ann"]; // 30
// int b = ages["Zoe"]; // throws KeyNotFoundExceptionVeilig opzoeken met TryGetValue
TryGetValue voorkomt uitzonderingen. De methode retourneert true en stelt een out-variabele in als de sleutel bestaat, of retourneert anders false.
Dit is de idiomatische manier zonder allocaties om een waarde op te zoeken waarvan je niet zeker weet of die bestaat.
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 en standaardwaarden
ContainsKey controleert of een sleutel bestaat zonder de waarde te lezen, in O(1). Gebruik de methode vóór een lezing via de indexer als je alleen ja of nee nodig hebt.
Als je zowel ContainsKey als de indexer aanroept, bereken je de hash van de sleutel twee keer. TryGetValue doet dat één keer en is daarom meestal sneller.
var ages = new Dictionary<string, int> { ["Ann"] = 30 };
if (ages.ContainsKey("Ann"))
System.Console.WriteLine(ages["Ann"]);Toevoegen versus toewijzen
De indexer dict[key] = value voegt een nieuw paar toe of overschrijft een bestaand paar. Add(key, value) voegt alleen een paar toe en gooit een uitzondering als de sleutel al bestaat.
Gebruik Add wanneer een dubbele sleutel een fout moet zijn, en gebruik de indexer wanneer overschrijven geen probleem is.
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"]);
}
}Items verwijderen
Remove(key) verwijdert een paar en retourneert gemiddeld in O(1) true als de sleutel aanwezig was.
Een overbelasting retourneert de verwijderde waarde via een out-parameter. Dat is handig als je de waarde in één stap wilt verwijderen en gebruiken.
var d = new Dictionary<string, int> { ["a"] = 1, ["b"] = 2 };
bool removed = d.Remove("a"); // true
bool again = d.Remove("a"); // falseParen doorlopen
Een lus levert items van het type KeyValuePair<TKey, TValue> op. Splits deze op in een sleutel en een waarde voor overzichtelijke code.
De volgorde waarin je de items doorloopt, is niet gegarandeerd. Vertrouw nooit op de volgorde waarin de items zijn toegevoegd. Gebruik Keys of Values om slechts één kant te doorlopen.
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}");
}
}Tellen met een woordenboek
Een klassiek gebruik is het tellen van voorkomens. Verhoog voor elk item de teller en begin bij nul als het item nieuw is.
Dit patroon draait in O(n) voor n items, omdat elke opzoeking en update O(1) kost. Als je telkens een lijst zou doorzoeken, zou dat O(n kwadraat) kosten.
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']);
}
}Sleutelgelijkheid is belangrijk
Opzoekingen zijn afhankelijk van GetHashCode en Equals van het sleuteltype. Ingebouwde typen en string werken direct.
Overschrijf voor sleutels van aangepaste klassen beide methoden, of gebruik een record. Anders krijgen twee sleutels die er gelijk uitzien verschillende hashes en mislukken opzoekingen.
var byName = new Dictionary<string, int>(
System.StringComparer.OrdinalIgnoreCase);
byName["Hi"] = 1;
bool found = byName.ContainsKey("HI"); // trueEen waardetype kiezen
Waarden kunnen van alles zijn, ook lijsten. Een Dictionary<string, List<int>> groepeert meerdere waarden onder één sleutel.
Maak bij het toevoegen aan zo'n structuur de binnenste lijst bij het eerste gebruik en voeg de waarde daarna aan die lijst toe. Zo bouw je een gegroepeerde structuur met meerdere waarden.
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);
}Korte test
Kies de veiligste manier om een mogelijk ontbrekende sleutel te lezen.
Samenvatting
Dictionary<K,V> biedt gemiddeld O(1) voor opzoeken, toevoegen en verwijderen op sleutel, dankzij een hashtabel.
Geef de voorkeur aan TryGetValue boven de indexer die een uitzondering gooit, houd sleutels uniek en zorg dat aangepaste sleuteltypen correcte gelijkheid en hashing implementeren. De volgorde bij het doorlopen is ongedefinieerd.
Leer C# met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 93
- Lessen
- 346
Veelgestelde vragen
Is de les “Dictionary-lookups” gratis?
Ja — de volledige tekst van “Dictionary-lookups” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus C# Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus C# Academy bevat in totaal 4 lessen.
Wat leer ik in “Dictionary-lookups”?
Snelle toegang via sleutel en waarde. Je oefent met C# Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met C# Academy te beginnen?
Ervaring vooraf is niet nodig. C# Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “Dictionary-lookups”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over C# Academy?
Ja. Elke les over C# Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- List in de praktijk
- Dictionary-lookups
- HashSet en uniciteit
- Een collectie kiezen