Vezérlőpult
E5. Dictionary · Tömbök, listák, Dictionary

E blokk · Tömbök, listák, Dictionary · 5. tananyag

Dictionary: kulcs-érték párok a gyakorlatban

A tömb és a lista sorszám szerint ad vissza elemet. Sokszor viszont egy név érdekel: mennyi alma van raktáron? Mi Anna telefonszáma? Két párhuzamos tömbbel ez megoldható, de minden lekérdezéshez végig kell keresni a neveket. A Dictionary a kulcsot közvetlenül az értékhez rendeli: keszlet["alma"] — és kész.

2 tanórakulcs · értékTryGetValue · számlálás

Tanulási célok

1Kulcs és érték

Dictionary<string, int> keszlet = new Dictionary<string, int>();
keszlet["alma"] = 40;
keszlet["körte"] = 12;
keszlet["szilva"] = 0;

Console.WriteLine(keszlet["alma"]);   // 40
KULCS (string, egyedi) ÉRTÉK (int) "alma" "körte" "szilva" 40 12 0

Kezdőértékekkel is létrehozható:

Dictionary<string, string> szotar = new Dictionary<string, string>
{
    ["kutya"] = "dog",
    ["macska"] = "cat",
    ["ló"] = "horse"
};

2Hozzáadás és módosítás: Add vagy indexelés?

Két módon kerülhet új pár a Dictionary-be, és a különbség fontos:

keszlet.Add("banán", 25);     // új pár — ha a kulcs már létezik: KIVÉTEL
keszlet["banán"] = 30;        // ha létezik: felülírja; ha nem: létrehozza
MűveletHa a kulcs még nincs benneHa a kulcs már benne van
Add(kulcs, ertek)felveszi a pártArgumentException — a program leáll
d[kulcs] = ertekfelveszi a pártfelülírja az értéket

Az Add tehát akkor jó, ha a kulcs ismétlődése hiba lenne (pl. két diák ugyanazzal az azonosítóval); az indexelés, ha a felülírás a kívánt viselkedés. Létező érték módosítása indexeléssel: keszlet["alma"] += 10;

3Biztonságos lekérdezés

Ha a kulcs nincs a Dictionary-ben, az olvasás kivételt okoz:

Console.WriteLine(keszlet["dinnye"]);
// KeyNotFoundException: The given key 'dinnye' was not present in the dictionary.

Két eszköz védi ki:

ContainsKey — előbb kérdezz
if (keszlet.ContainsKey("dinnye"))
{
    Console.WriteLine(keszlet["dinnye"]);
}
else
{
    Konzol.Hiba("Nincs ilyen termék.");
}
TryGetValue — egy lépésben
if (keszlet.TryGetValue("körte", out int darab))
{
    Console.WriteLine($"Körte: {darab} db");
}
else
{
    Konzol.Hiba("Nincs ilyen termék.");
}
ℹ️ ISMERŐS MINTA

A TryGetValue a D3-as TryParse-minta újabb példája: a visszatérési érték a siker (bool), az out paraméter az eredmény.

4Törlés és bejárás

bool torolve = keszlet.Remove("szilva");   // true, ha volt ilyen kulcs
Console.WriteLine(keszlet.Count);          // a párok száma

A bejárás kulcs-érték párokon megy végig:

foreach (KeyValuePair<string, int> par in keszlet)
{
    Console.WriteLine($"{par.Key,-10}{par.Value,5} db");
}
⚠️ A SORRENDRE NE ÉPÍTS

A Dictionary nem garantálja, hogy a bejárás a felvétel sorrendjében történik. Ha rendezett kiírás kell, arra később látunk eszközt.

5A számlálás mintája

A Dictionary egyik leggyakoribb felhasználása a gyakoriság számlálása — hány szavazatot kapott egy jelölt, hányszor fordul elő egy szó:

Dictionary<string, int> szavazatok = new Dictionary<string, int>();

string szavazat;
do
{
    Console.Write("Szavazat (üres sor: vége): ");
    szavazat = Console.ReadLine();

    if (szavazat != "")
    {
        if (szavazatok.ContainsKey(szavazat))
        {
            szavazatok[szavazat]++;       // már van ilyen: növeljük
        }
        else
        {
            szavazatok[szavazat] = 1;     // első szavazat erre a jelöltre
        }
    }
}
while (szavazat != "");

foreach (var par in szavazatok)
{
    Console.WriteLine($"{par.Key}: {par.Value} szavazat");
}

A lényeg a belső if: ha a kulcs már létezik, növeljük; ha még nem, felvesszük 1-es értékkel. Ez az E2-es megszámlálás tétele, csak most sok számláló egyszerre — kulcsonként egy.

6Tömb, lista vagy Dictionary?

KérdésGyűjtemény
fix darabszámú elem, sorszám szerinttömb (T[])
változó darabszámú elem, sorrendbenlista (List<T>)
érték név / azonosító szerint keresveDictionary<TKey, TValue>

Tömb, lista vagy Dictionary?

Sorszám szerint, fix mérettel — sorszám szerint, változó mérettel — vagy név szerint?

1 / 8Pontszám: 0
…

7Gyakori hibák

TünetMi történt?Mit tegyél?
ArgumentException: An item with the same key has already been addedAdd létező kulccsalfelülíráshoz indexelés; vagy előbb ContainsKey
KeyNotFoundExceptionnem létező kulcsot olvastálContainsKey vagy TryGetValue előtte
a „Körte” nem található, pedig „körte” van bennea kulcs kis-nagybetű érzékenyegységesíts (pl. mindig kisbetűvel tárolj — I blokk: ToLower)
a kiírás sorrendje más, mint a felvételéa Dictionary nem garantál sorrendetne építs a sorrendre
CS1061 a par.Kulcs-raa pár tulajdonságai angol nevűekpar.Key és par.Value
a számláló kivétellel indulaz első előfordulásnál d[kulcs]++ — a kulcs még nem létezikelőbb ContainsKey, az első esetben = 1

8Gyakorlat — raktárkezelő

  1. Új projekt: Console App, név: Raktar, .NET 10 + Konzol.cs.
  2. Hozz létre egy Dictionary<string, int> készletet néhány kezdő termékkel.
  3. Visszatérő menü: [1] Beérkezés (termék és darab bekérése — ha a termék létezik, a darabszám növekszik, ha nem, felvesszük), [2] Kiadás (csak akkor, ha van elég — különben piros hiba), [3] Készlet listázása (igazított táblázat, a 0 darabos termékek sárgával), [4] Keresés (TryGetValue), [K] Kilépés.
  4. Minden menüpont legyen külön metódus, amely paraméterként kapja a készletet.
  5. Commit: Raktar: Dictionary menuvel.
✅ ELLENŐRZŐ PONT

A meglévő termék beérkezése növeli a darabszámot, az új felveszi; a nem létező termék kiadása és keresése nem okoz kivételt; a készletnél többet nem lehet kiadni.

9Feladatok

Gyakorló feladatok

⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás

E5.1⭐

Hozz létre egy magyar–angol szótárt öt szóval, kérj be egy magyar szót, és írd ki a fordítását — ha nincs a szótárban, jelezd.

E5.2⭐

Tárold öt ország fővárosát (Dictionary<string, string>), és írd ki az összes párt „Ország: főváros” alakban.

E5.3⭐⭐

Kérj be egy mondatot, bontsd szavakra (mondat.Split(' ') — string-tömböt ad vissza), és írd ki, melyik szó hányszor fordul elő.

E5.4⭐⭐

Egy osztály diákjainak pontszámait tárold név szerint. Írd ki a legtöbb pontot elért diák nevét és pontszámát (maximumkiválasztás a párokon).

E5.5⭐⭐⭐

Kérj be egy szöveget, és írd ki, melyik betű hányszor szerepel benne (Dictionary<char, int>) — a szóközöket hagyd ki.

10Önellenőrző kvíz

Ellenőrizd magad!

Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.

11Fogalomtár

FogalomJelentés
Dictionary<TKey, TValue>kulcs-érték párok gyűjteménye; az érték a kulccsal érhető el
kulcsegyedi azonosító, amely alapján az értéket keressük
értéka kulcshoz rendelt adat
Addúj pár felvétele — létező kulcsnál kivétel
ContainsKeyszerepel-e a kulcs
TryGetValueellenőrzés és kiolvasás egy lépésben (TryParse-minta)
KeyValuePairegy kulcs-érték pár; tulajdonságai Key és Value
gyakoriságszámláláskulcsonkénti számlálás Dictionary-vel

12Összegzés

  1. A Dictionary kulcs-érték párokat tárol; a kulcs egyedi, az érték a kulccsal érhető el: d["alma"].
  2. Add: új pár, létező kulcsnál kivétel; indexelés: létrehoz vagy felülír.
  3. Nem létező kulcs olvasása kivétel — előtte ContainsKey vagy TryGetValue.
  4. A bejárás KeyValuePair-eken megy (Key, Value); a sorrendre ne építs.
  5. A számlálás mintája: ha van kulcs, növelj; ha nincs, vedd fel 1-gyel.
  6. Tömb — lista — Dictionary: sorszám fix mérettel, sorszám változó mérettel, név szerint. A következő oldal ezeket gyakoroltatja együtt.