Vezérlőpult
E4. A List<T> · Tömbök, listák, Dictionary

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

A List<T>: a bővíthető gyűjtemény

A tömb mérete létrehozáskor eldől. Sok feladatnál viszont előre nem tudjuk, hány elem lesz: a C7-es pizzafutár-kasszánál addig jöttek a tételek, amíg a felhasználó 0-t nem írt. Erre való a List<T>: menet közben bővíthető és szűkíthető, közben ugyanúgy indexelhető, mint a tömb. Az A2-ben említett generikusok is itt kerülnek elő.

2 tanóraAdd · Remove · Counttömb vagy lista?

Tanulási célok

1Létrehozás: a List<T>

List<string> bevasarlas = new List<string>();          // üres lista
List<int> jegyek = new List<int> { 5, 4, 3 };         // kezdőelemekkel

2Bővítés és elérés

List<string> bevasarlas = new List<string>();

bevasarlas.Add("kenyér");          // a lista végére
bevasarlas.Add("tej");
bevasarlas.Add("alma");
bevasarlas.Insert(0, "kávé");      // a 0. helyre, a többi hátrébb csúszik

Console.WriteLine(bevasarlas.Count);    // 4
Console.WriteLine(bevasarlas[0]);       // kávé
bevasarlas[2] = "kakaó";                // a "tej" helyére
Console.WriteLine(string.Join(", ", bevasarlas));   // kávé, kenyér, kakaó, alma
⚠️ COUNT, NEM LENGTH

A lista méretének neve Count, a tömbé Length. Ez a különbség kezdetben sok hibát okoz — a fordító szerencsére jelzi (CS1061).

3Törlés és keresés

List<string> bevasarlas = new List<string> { "kávé", "kenyér", "tej", "kenyér" };

bool sikerult = bevasarlas.Remove("kenyér");   // az ELSŐ "kenyér" törlése → true
bevasarlas.RemoveAt(0);                         // a 0. elem ("kávé") törlése
Console.WriteLine(string.Join(", ", bevasarlas));   // tej, kenyér

Console.WriteLine(bevasarlas.Contains("tej"));  // True
Console.WriteLine(bevasarlas.IndexOf("alma"));  // -1 — nincs benne

bevasarlas.Clear();                             // minden elem törlése
Console.WriteLine(bevasarlas.Count);            // 0
MetódusMit csinál?Mit ad vissza?
Remove(elem)törli az elem első előfordulásáttrue, ha talált és törölt; false, ha nem volt benne
RemoveAt(index)törli a megadott helyen álló elemetsemmit (void)
Clear()kiüríti a listátsemmit
Contains(elem)benne van-e az elembool
IndexOf(elem)hol van az elem első előfordulásaaz indexet, vagy -1, ha nincs benne

A Contains az E2-es eldöntés, az IndexOf a keresés tétele — a lista készen adja őket. Rendezéshez és megfordításhoz a Sort() és a Reverse() metódus használható.

4Bejárás — és a bejárás közbeni törlés

A bejárás ugyanúgy megy, mint a tömbnél, csak Length helyett Count:

for — sorszámmal
for (int i = 0; i < bevasarlas.Count; i++)
{
    Console.WriteLine($"{i + 1}. {bevasarlas[i]}");
}
foreach — csak az elemek
foreach (string tetel in bevasarlas)
{
    Console.WriteLine(tetel);
}
⚠️ FOREACH KÖZBEN NE MÓDOSÍTSD A LISTÁT

Ha a foreach törzsében Add-ot vagy Remove-ot hívsz, a program InvalidOperationException kivétellel leáll („Collection was modified”).

Ha feltétel szerint kell törölni, használj visszafelé haladó for-t:

for (int i = jegyek.Count - 1; i >= 0; i--)
{
    if (jegyek[i] == 1)
    {
        jegyek.RemoveAt(i);
    }
}

Miért visszafelé? Előrefelé haladva a törölt elem helyére becsúszik a következő, és a ciklus azt átugorja. Hátulról haladva a törlés csak a már feldolgozott elemek helyét érinti.

5Tömb vagy lista?

SzempontTömb (int[])Lista (List<int>)
méretlétrehozáskor rögzülmenet közben változik
méret lekérdezéseLengthCount
bővítés, törlésnem lehetségesAdd, Insert, Remove, RemoveAt
kereséssaját ciklussal (E2)Contains, IndexOf
mikor válaszd?ismert, fix darabszám (a hét napjai, 12 hónap, egy tábla sorai)ismeretlen vagy változó darabszám (rendelés tételei, bekért adatok)

A listát metódusnak ugyanúgy átadhatod, mint a tömböt, és ugyanúgy referencia: a metódus módosíthatja a hívó listáját (E2).

Tömb vagy lista?

Előre ismert és fix az elemek száma — vagy menet közben változik?

1 / 8Pontszám: 0
…

6Gyakori hibák

TünetMi történt?Mit tegyél?
CS1061: 'List<int>' does not contain a definition for 'Length'tömbös szokásból Length-et írtállistánál Count
CS1503 az Add sorábanrossz típusú elemet adtál hozzá (pl. List<int>-be szöveget)az elem típusa egyezzen a <T>-vel
InvalidOperationException: Collection was modifieda foreach törzsében módosítottad a listátfeltételes törléshez visszafelé haladó for
feltételes törlés után egy elem bennmaradelőrefelé haladó for + RemoveAt — az elem átugrikvisszafelé haladj: for (int i = Count - 1; i >= 0; i--)
ArgumentOutOfRangeExceptiona lista határán kívüli index0 … Count - 1; előbb ellenőrizd
a Remove „nem működik”az elem nincs a listában (pl. más kis-nagybetűvel)a visszatérési értéke megmondja: false = nem talált
CS0165: Use of unassigned local variable az Add-nála listát deklaráltad, de nem hoztad létre= new List<string>();

7Gyakorlat — bevásárlólista

  1. Új projekt: Console App, név: Bevasarlolista, .NET 10 + Konzol.cs.
  2. Hozz létre egy üres List<string> listát.
  3. Írj visszatérő menüt (C5, D5.11) ezekkel a pontokkal: [1] Tétel hozzáadása, [2] Tétel törlése név szerint, [3] Lista kiírása sorszámozva, [4] Tétel törlése sorszám szerint, [K] Kilépés.
  4. Minden menüpont legyen külön metódus, amely paraméterként kapja a listát.
  5. Hozzáadáskor ha a tétel már szerepel, jelezz sárgával, és ne vedd fel újra. Törléskor a nem létező tételre és az érvénytelen sorszámra adj piros hibaüzenetet.
  6. Commit: Bevasarlolista: List<T> menuvel.
✅ ELLENŐRZŐ PONT

A lista tetszőleges hosszúra bővíthető; a duplikátum nem kerül be; mindkét törlés működik, és egyik sem címez túl; üres listánál a kiírás jelzi, hogy a lista üres.

8Feladatok

Gyakorló feladatok

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

E4.1⭐

Kérj be neveket, amíg a felhasználó üres sort nem ad, majd írd ki, hány nevet adott meg, és a neveket vesszővel elválasztva.

E4.2⭐

Hozz létre egy listát 10 számmal, töröld belőle az első és az utolsó elemet, és írd ki a maradékot.

E4.3⭐⭐

Kérj be számokat 0-ig (a 0 ne kerüljön be), majd írd ki az összegüket, az átlagukat és a legnagyobbat — a programozási tételekkel, listán.

E4.4⭐⭐

Egy lista tartalmazza az osztály jegyeit. Töröld belőle az összes egyest, és írd ki, hány egyes volt.

E4.5⭐⭐⭐

Írj List<int> Kozos(List<int> a, List<int> b) metódust, amely azokat a számokat adja vissza, amelyek mindkét listában szerepelnek — mindegyiket csak egyszer.

9Önellenőrző kvíz

Ellenőrizd magad!

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

10Fogalomtár

FogalomJelentés
List<T>menet közben bővíthető és szűkíthető, indexelhető gyűjtemény
generikus típustípussal paraméterezett típus — a <T> helyére írod az elemtípust
Counta lista aktuális elemszáma
Add / Insertelem hozzáadása a végére / a megadott helyre
Remove / RemoveAtelem törlése érték szerint (első előfordulás) / index szerint
Contains / IndexOfbenne van-e / hol van (−1, ha nincs)
implicit usinga projekt által alapértelmezetten elérhetővé tett névterek (pl. System.Collections.Generic)

11Összegzés

  1. A List<T> bővíthető gyűjtemény; a <T> az elemtípus — a generikusok gyakorlati haszna.
  2. Bővítés: Add, Insert; törlés: Remove, RemoveAt, Clear; keresés: Contains, IndexOf.
  3. A méret Count, az indexelés 0-tól Count - 1-ig — mint a tömbnél.
  4. foreach közben nem módosítható a lista; feltételes törléshez visszafelé haladó for kell.
  5. Fix darabszámhoz tömb, változó darabszámhoz lista.
  6. Következik: amikor nem sorszám, hanem név szerint keressük az adatot — a Dictionary.