C# Academy · Les

Dictionary-lookups

Snelle toegang via sleutel en waarde.

Les 2 van 413 stappen

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 KeyNotFoundException

Veilig 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");     // false

Paren 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"); // true

Een 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.

Gratis beginnen

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

  1. List in de praktijk
  2. Dictionary-lookups
  3. HashSet en uniciteit
  4. Een collectie kiezen
← Terug naar C# Academy