Kihagyás

Összetett adattípusok

A Java-anyag ArrayList, HashSet és HashMap témáinak C# megfelelői a List<T>, HashSet<T> és Dictionary<TKey, TValue>. A Pythonból ismert lista, halmaz és szótár szerepe itt is hasonló. A <T> jelzi az elemek típusát; egy List<int> csak egész számokat tárol.

Tömb és List<T>

A tömb mérete rögzített, a List<T> bővíthető. Mindkettő nullától indexel.

int[] fixSzamok = { 2, 4, 6 };
List<string> autok = new() { "Volvo", "BMW", "Ford" };

Elem hozzáadása és elérése

List<string> autok = new();
autok.Add("Volvo");
autok.Add("BMW");
Console.WriteLine(autok[0]); // Volvo
autok[0] = "Opel";
autok = []
autok.append("Volvo")
autok.append("BMW")
print(autok[0])
autok[0] = "Opel"

Törlés, kiürítés, elemszám

autok.Remove("BMW"); // első egyező értéket törli; bool eredményt ad
autok.RemoveAt(0);   // adott indexű elemet töröl
int darab = autok.Count;
autok.Clear();

Pythonban ezek megfelelői: remove, pop(index), len(lista) és clear. Érvénytelen indexnél C#-ban kivétel keletkezik.

Bejárás és rendezés

List<int> szamok = new() { 10, 15, 5, 20 };
foreach (int szam in szamok)
{
    Console.WriteLine(szam);
}

szamok.Sort();      // növekvő sorrend
szamok.Reverse();   // most csökkenő sorrend
Console.WriteLine($"Minimum: {szamok.Min()}, maximum: {szamok.Max()}");

Az Min() és Max() üres listán kivételt dob; előbb ellenőrizzük a Count értékét. Pythonban sort(), reverse(), min() és max() használható.

HashSet<T>

A halmaz csak egyedi elemeket tárol. A bejárási sorrendre nem szabad építeni.

HashSet<string> szinek = new() { "piros", "kék" };
szinek.Add("zöld");
szinek.Add("piros"); // nem kerül be másodszor
bool vanKek = szinek.Contains("kék");
szinek.Remove("kék");
Console.WriteLine(szinek.Count);
szinek.Clear();
szinek = {"piros", "kék"}
szinek.add("zöld")
szinek.add("piros")
van_kek = "kék" in szinek
szinek.discard("kék")
print(len(szinek))
szinek.clear()

Két halmaz uniójához UnionWith, metszetéhez IntersectWith használható; ezek a bal oldali halmazt módosítják.

HashSet<int> a = new() { 1, 2 };
HashSet<int> b = new() { 2, 3 };
a.UnionWith(b); // a: 1, 2, 3

Dictionary<TKey, TValue>

A szótár kulcshoz értéket rendel. A kulcsok egyediek; kulcs szerinti lekérdezéskor célszerű TryGetValue-t használni, mert a hiányzó kulcsra a szotar[kulcs] kivételt dob.

Dictionary<string, int> jegyek = new()
{
    ["Anna"] = 5,
    ["Béla"] = 4
};
jegyek["Csilla"] = 3; // új elem, létező kulcsnál módosítás

if (jegyek.TryGetValue("Anna", out int jegy))
{
    Console.WriteLine(jegy);
}

foreach (KeyValuePair<string, int> par in jegyek)
{
    Console.WriteLine($"{par.Key}: {par.Value}");
}

jegyek.Remove("Béla");
Console.WriteLine(jegyek.Count);
jegyek.Clear();
jegyek = {"Anna": 5, "Béla": 4}
jegyek["Csilla"] = 3
print(jegyek.get("Anna"))
for nev, jegy in jegyek.items():
    print(f"{nev}: {jegy}")
jegyek.pop("Béla", None)
print(len(jegyek))
jegyek.clear()

Feladat

Olvass be neveket addig, amíg a felhasználó üres sort nem ad! Tárold őket listában, majd készíts halmazt az ismétlődések kiszűrésére. Szótárban számold meg, hogy az egyes nevek hányszor fordultak elő.