12. diel - List vo Visual Basic .NET
V predchádzajúcom cvičení, Riešené úlohy k 11. lekcii OOP v VB .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 VB .NET , sme si povedali niečo o dátume a čase. V dnešnom VB.NET tutoriále si 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á celá sekcia. Doteraz poznáme iba kolekciu poľa. V priebehu seriálu 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 Listu 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 Listu. Ak už nebudeme chcieť losovať, program vypíše losovanie čísla, zoradené od najmenšieho po najväčšie. Založme si nový projekt žrebovania a vytvorme si triedu Žrebovacie. Trieda bude obsahovať List typu Integer, 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:
Dim cisla As List(Of Integer)
Dátový typ píšeme u generických kolekcií do okrúhlych zátvoriek za kľúčové slovo Of. 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:
Dim cisla As List(Of Integer) = New List(Of Integer)
Takýto list teda umiestnime do našej triedy, spolu s náhodným generátorom Random. Atribúty inicializujeme v ich deklarácii. Mohli by sme ich inicializovať aj v konstruktoru. Obe možnosti sú správne, avšak všeobecne sa odporúča všetko inicializovať už v deklarácii, aby sa predišlo výnimkám, kedy odkazujeme na neinicializovaný objekt.
Public Class Losovac Private cisla As List(Of Integer) = New List(Of Integer) Private random As Random = New Random() End Class
Ďalej pridáme metódy losujme () a Vypis (), kde losujme () pridá do Listu nové 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 dielu o hracej kocke, tu budeme vyhadzovať čísla od 1 do 100. Číslo do Listu pridáme pomocou metódy Add ():
Public Function Losuj() As Integer Dim cislo As Integer = random.Next(100) + 1 cisla.Add(cislo) Return cislo End Function
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 Listu, ktorá list zotriedi. Je podobná metóde Sort () na triede Array. Metóda nič nevracia, iba List vnútri zotriedi.
Public Function Vypis() As String Dim s As String = "" cisla.Sort() For Each i As Integer In cisla s &= i & " " Next Return s End Function
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 Character, nie ako String.
Dim losovac As New Losovac() Console.WriteLine("Vítejte v programu losování.") Dim volba As Char = "0"C ' hlavní cyklus While volba <> "3"C ' výpis možností Console.WriteLine("1 - Losovat další číslo") Console.WriteLine("2 - Vypsat čísla") Console.WriteLine("3 - Konec") volba = Console.ReadKey().KeyChar Console.WriteLine() ' reakce na volbu Select Case volba Case "1" Console.WriteLine("Padlo číslo: {0}", losovac.Losuj()) Case "2" Console.WriteLine("Padla čísla: {0}", losovac.Vypis()) Case "3" Console.WriteLine("Děkuji za použití programu") Case Else Console.WriteLine("Neplatná volba, zadejte prosím znovu.") End Select End While
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 Select Case a vykonáme príslušné akcie. Ak bolo zadané niečo iné, pokryje to možnosť Case Else.
Konzolová aplikácia
3 - Konec
1
Padlo číslo: 52
1 - Losovat další číslo
2 - Vypsat čísla
3 - Konec
1
Padlo číslo: 40
1 - Losovat další číslo
2 - Vypsat čísla
3 - Konec
1
Padlo číslo: 62
1 - Losovat další číslo
2 - Vypsat čísla
3 - Konec
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 - Losovat další číslo
2 - Vypsat čísla
3 - Konec
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 Listom 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:
Dim l As New List(Of String) l.Add("První") Console.WriteLine(l(0)) l(0) = "První položka" Console.WriteLine(l(0)) l(1) = "Druhá položka" ' vyhodí chybu
Vytvoríme si List STRING. 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 Listu môžeme List vytvoriť aj ako kópiu z iného Listu, pole alebo iné kolekcie. Stačí kolekciu odovzdať do konstruktoru:
{VBNET_CONSOLE}
Dim poleStringu As String() = {"První", "Druha", "Třetí"}
Dim l As New List(Of String)(poleStringu)
Console.WriteLine(l(2))
{/VBNET_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 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 (kolekcia) - 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 Liste.
- InsertRange (index, kolekcia) - Vloží prvky danej kolekcie na daný index v Liste.
- LastIndexOf (položka) - Vracia index posledného výskytu položky v Liste. Vracia -1 pri neúspechu.
- Remove (položka) - Vymaže prvú nájdenú položku.
- Removei (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 Liste.
- Sort () - Sort už tiež poznáme, zotriedi položky v liste. Metóda opäť nič nevracia.
- ToArray () - Skopíruje položky z Listu 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 Listu ako double.
- Distinct () - Vráti unikátny elementy z Listu.
- First () - Vráti prvý element.
- Last () - Vráti posledný element.
- Intersect (kolekcia) - Vráti prienik Listu so zadanou kolekcií.
- Union () - Vráti zjednotenie Listu 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 Listu.
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 sekcii 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 vo VB.NET , si urobíme pomocou Listu databázu, bude to elektronický diár!