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:
{CSHARP_CONSOLE}
string[] poleStringu = {"Prvý", "Druha", "Tretí"};
List<string> l = new List<string>(poleStringu);
Console.WriteLine(l[2]);
{/CSHARP_CONSOLE}
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 akoLength
na poli, vracia počet prvkov v kolekcii.
Metódy na liste
Add(položka)
- MetóduAdd()
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)
- Vraciatrue
/false
podľa toho, čiList
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) vList
u.InsertRange(index, kolekce)
- Vloží prvky danej kolekcie na daný index vList
u.LastIndexOf(položka)
- Vracia index posledného výskytu položky vList
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átiList
tak, že je prvá položka posledný a naopak. Metóda nič nevracia, zmeny sa vykonajú priamo vListu
.Sort()
-Sort()
už tiež poznáme, zotriedi položky v liste. Metóda opäť nič nevracia.ToArray()
- Skopíruje položky zList
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 vList
u akodouble
.Distinct()
- Vráti unikátny elementy zList
u.First()
- Vráti prvý element.Last()
- Vráti posledný element.Intersect(kolekce)
- Vráti prienikList
u so zadanou kolekcií.Union()
- Vráti zjednotenieList
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čiatkuList
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, žeList
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é 917x (26.67 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#