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 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:

Dim poleStringu As String() = {"První", "Druha", "Třetí"}
Dim l As New List(Of 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 (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! :)


 

Predchádzajúci článok
Riešené úlohy k 11. lekcii OOP v VB .NET
Všetky články v sekcii
Objektovo orientované programovanie vo Visual Basic .NET
Preskočiť článok
(neodporúčame)
Diár s databázou vo VB.NET
Článok pre vás napísal Michal Žůrek - misaz
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.
Aktivity