Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

12. diel - List

V predchádzajúcom cvičení, Riešené úlohy k 11. lekcii OOP v C # .NET, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V minulej lekcii, Riešené úlohy k 11. lekcii OOP v C # .NET , sme si povedali niečo o dátume a čase. Dnes si v C # tutoriále ukážeme jednu kolekciu, ktorá je múdrejší, než polia. Umožňuje totiž prvky ľubovoľne pridávať a mazať.

Pojem kolekcia sme tu už spomenuli. Je to štruktúra, do ktorej môžeme ukladať viac objektov. Kolekcií je v .NET frameworku veľké množstvo, sú prispôsobené pre rôzne účely a môžeme s nimi zaobchádzať rôznymi spôsobmi. Preto im je venovaný aj celý kurz Kolekcia a LINQ . Doteraz poznáme iba kolekciu poľa. V priebehu kurzu však budeme potrebovať niečo múdrejšieho, kam budeme môcť jednoducho za behu programu pridávať a mazať záznamy. Iste by sa nám hodilo si v pamäti spravovať databázu nejakých objektov. Vieme, že pole má konštantnú veľkosť, čo je daň za jeho vysokú rýchlosť. Teraz si predstavíme List , ktorý môžeme chápať ako nadstavbu poľa.

List

List je tzv. Generická kolekcie. Pojem genericita si plne vysvetlíme až u kolekcií, teraz nám bude stačiť vedieť, že pri deklarácii List u musíme špecifikovať dátový typ objektov, ktoré v ňom budú uložené. Začnime jednoducho a urobme si List čísel, ktorá budeme náhodne losovať.

Žrebovanie

Program sa nás vždy opýta, či chceme losovať ďalšie číslo a to sa pridá do List u. Ak už nebudeme chcieť losovať, program vypíše losovanie čísla, zoradené od najmenšieho po najväčšie. Založme si nový projekt Losovani a vytvorme si triedu Losovac . Trieda bude obsahovať List typu int , kde budú čísla uložené. List bude privátne a bude slúžiť iba ako interný úložisko danej triedy, aby sa na neho zvonku nedalo pristupovať. List deklarujeme takto:

List<int> cisla;

Dátový typ píšeme u generických kolekcií do špicatých zátvoriek. List je samozrejme objekt, ako každý iný. Rovnako ako u poľa a iných objektov, aj tu premennú pred použitím inicializujeme:

List<int> cisla = new List<int>();

Všimnite si zátvoriek, ktoré značí konštruktor. Takýto list teda umiestnime do našej triedy, spolu s náhodným generátorom Random . V konstruktoru atribúty inicializujeme:

class Losovac
{
    private List<int> cisla;
    private Random random;

    public Losovac()
    {
        random = new Random();
        cisla = new List<int>();
    }

}

Ďalej pridáme metódy Losuj() a Vypis() , kde Losuj() pridá do List u novej náhodné číslo a tiež ho vráti ako návratovú hodnotu. Vypis() vráti textový reťazec pre vypísanie. Ten bude obsahovať čísla z cisla , zoradené a oddelené medzerou.

Žrebovanie náhodného čísla už poznáme z lekcie o hracej kocke , tu budeme vyhadzovať čísla od 1 do 100 . Číslo do List u pridáme pomocou metódy Add() :

public int Losuj()
{
    int cislo = random.Next(100) + 1;
    cisla.Add(cislo);
    return cislo;
}

Veľmi jednoduché, že? Kolekcia List je interne pomerne zložitá a zatiaľ sa nebudeme zaoberať tým, čo sa vo vnútri deje. To je napokon účel .NET frameworku, ponúkať kvalitné a sofistikované komponenty, ktoré sa jednoducho používajú.

Výpis čísiel bude ešte jednoduchšie. K zotriedenie použijeme metódu Sort() na List u, ktorá list zotriedi. Je podobná metóde Sort() na triede Array . Metóda nič nevracia, iba List vnútri zotriedi.

public string Vypis()
{
    string s = "";
    cisla.Sort();
    foreach (int i in cisla)
        s += i + " ";
    return s;
}

Hotovo.

Presuňme sa do Main() a pomocou while cyklu umožnime užívateľovi ovládať objekt. Podobný program bola kalkulačka z prvých lekcií, kde sme sa v cykle pýtali, či si užívateľ praje opakovať výpočet. Tu budeme postupovať totožne.

Ovládanie bude pomocou možnosťou 1, 2, 3 (losujme, vypiše, koniec). Budeme ich načítať pomocou Console.ReadKey() ako char , nie ako string . Nezabudnite teda, že znaky zapisujeme pomocou apostrofov, nie úvodzoviek.

Losovac losovac = new Losovac();
Console.WriteLine("Vitajte v programe žrebovaní.");
char volba = '0';
// hlavný cyklus
while (volba != '3')
{
    // výpis možností
    Console.WriteLine("1 - Losovať ďalšie číslo");
    Console.WriteLine("2 - Vypísať čísla");
    Console.WriteLine("3 - Koniec");
    volba = Console.ReadKey().KeyChar;
    Console.WriteLine();
    // reakcia na voľbu
    switch (volba)
    {
        case '1':
            Console.WriteLine("Padlo číslo: {0}", losovac.Losuj());
            break;
        case '2':
            Console.WriteLine("Padla čísla: {0}", losovac.Vypis());
            break;
        case '3':
            Console.WriteLine("Ďakujem za použitia programu");
            break;
        default:
            Console.WriteLine("Neplatná voľba, zadajte prosím znova.");
            break;
    }
}

Priebeh programu je z kódu dobre viditeľný. Najprv nastavíme voľbu na nejakú predvolenú hodnotu, aby cyklus prvýkrát prebehol. Potom voľbu načítame z klávesnice ako znak. Znak spracujeme pomocou switch ea vykonáme príslušné akcie. Ak bolo zadané niečo iné, pokryje to možnosť default: .

Konzolová aplikácia
3 - Koniec
1
Padlo číslo: 52
1 - Losovať ďalšie číslo
2 - Vypísať čísla
3 - Koniec
1
Padlo číslo: 40
1 - Losovať ďalšie číslo
2 - Vypísať čísla
3 - Koniec
1
Padlo číslo: 62
1 - Losovať ďalšie číslo
2 - Vypísať čísla
3 - Koniec
2
Padla čísla: 2 6 7 7 8 8 9 9 10 10 12 14 17 19 19 21 23 25 25 27 27 27 28 28 28 30 30 31 32 33 33 35 35 36 36 36 37 38 38 40 41 42 42 42 44 45 45 45 45 45 48 51 52 52 53 55 56 56 56 57 58 58 59 61 62 66 68 68 71 72 73 73 74 76 82 83 84 84 85 87 88 88 89 90 90 91 93 94 98 98 98 99 100
1 - Losovať ďalšie číslo
2 - Vypísať čísla
3 - Koniec

Vidíme, že môžeme stále pridávať nové a nové čísla. Máme oveľa väčšie možnosti, než s poľom. Zároveň však môžeme s List em pracovať úplne rovnako, ako sme pracovali s poľom.

Môžeme používať indexácii pomocou hranatých zátvoriek, ale pozor, prvok musí existovať. Skúsme si napísať nasledujúci kód:

List<string> l = new List<string>();
l.Add("Prvý");
Console.WriteLine(l[0]);
l[0] = "Prvá položka";
Console.WriteLine(l[0]);
l[1] = "Druhá položka";  // spôsobí chybu

Vytvoríme si List string ov. Pridáme položku "Prvý" a potom vypíšeme položku na indexe 0 . Vypíše sa nám "Prvý". Môžeme na ňu samozrejme aj takto zapisovať. S druhou položkou na pozíciu 1 však už nemôžeme pracovať, pretože sme ju do listu nepridali. U poľa sme zadali veľkosť a on všetky "priehradky" (premenné pod indexy) založil. Teraz veľkosť nezadávame a "priehradky" si pridávame sami.

Pozrime sa na List podrobnejšie a výpisy si metódy, ktoré sú pre nás teraz zaujímavé:

Konštruktory

Okrem prázdneho List u môžeme List vytvoriť aj ako kópiu z iného List u, pole alebo iné kolekcie. Stačí kolekciu odovzdať do konstruktoru:

string[] poleStringu = {"Prvý", "Druha", "Tretí"};
List<string> l = new List<string>(poleStringu);
Console.WriteLine(l[2]);

Kód vyššie vypíše "Tretia". Prvky pole sa do nového listu skopírujú. Rovnako môžeme odovzdať aj iný List.

Vlastnosti na liste

  • Count - Funguje ako Length na poli, vracia počet prvkov v kolekcii.

Metódy na liste

  • Add(položka) - Metódu Add() sme si už vyskúšali, ako parameter berie položku, ktorú vloží na koniec listu.
  • AddRange(kolekce) - Pridá do listu viacerých položiek, napr. Z poľa.
  • Clear() - Vymaže všetky položky v liste.
  • Contains(položka) - Vracia true / false podľa toho, či List obsahuje odovzdanú položku.
  • CopyTo(pole) - Skopíruje položky do odovzdaného poľa. Môžeme pridať parameter štartovej index a počet prvkov.
  • IndexOf(položka) - Vráti index prvého výskytu položky (ako u pole). Vracia -1 pri neúspechu.
  • Insert(index, položka) - Vloží položku na daný index (pozíciu) v List u.
  • InsertRange(index, kolekce) - Vloží prvky danej kolekcie na daný index v List u.
  • LastIndexOf(položka) - Vracia index posledného výskytu položky v List u. Vracia -1 pri neúspechu.
  • Remove(položka) - Vymaže prvú nájdenú položku.
  • RemoveAt(index) - Vymaže položku na danom indexe.
  • RemoveRange(index, počet) - Vymaže daný počet prvkov od zadaného indexu.
  • Reverse() - Funguje rovnako ako u poľa, obráti List tak, že je prvá položka posledný a naopak. Metóda nič nevracia, zmeny sa vykonajú priamo v Listu .
  • Sort() - Sort() už tiež poznáme, zotriedi položky v liste. Metóda opäť nič nevracia.
  • ToArray() - Skopíruje položky z List u do poľa a to vráti.

Ďalšie metódy

List poskytuje aj ďalšie metódy, ktoré poznáme z poľa:

  • Average() - Vráti priemer z položiek v List u ako double .
  • Distinct() - Vráti unikátny elementy z List u.
  • First() - Vráti prvý element.
  • Last() - Vráti posledný element.
  • Intersect(kolekce) - Vráti prienik List u so zadanou kolekcií.
  • Union() - Vráti zjednotenie List u so zadanou kolekcií.
  • Min() - Vráti najmenší prvok.
  • Max() - Vráti najväčší prvok.
  • Sum() - Vráti súčet prvkov.
  • Take(počet) - Vráti prvky od začiatku List u.

    Vidíme, že kolekcia List toho vie oveľa viac, než polia. Najväčšou výhodou je pridávanie a mazanie prvkov. Daň vo výkone je zanedbateľná. V kurze s kolekciami zistíme, že List má ešte ďalšie metódy, ale zatiaľ na to nemáme skúsenosti.

    Program pre ukladanie losovaných čísel bol zaujímavý, ale iste sa nám bude v budúcnosti hodiť ukladať skôr objekty, ako položky. V budúcej lekcii, Diár s databázou v C # , si urobíme pomocou List u databázu, bude to elektronický diár! :)


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 914x (26.67 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Riešené úlohy k 11. lekcii OOP v C # .NET
Všetky články v sekcii
Objektovo orientované programovanie v C #
Preskočiť článok
(neodporúčame)
Diár s databázou v C #
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
1 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity