12. diel - List vo Visual Basic .NET

Unicorn College Tento obsah je dostupný zadarmo v rámci projektu IT ľuďom. Vydávanie, hosting a aktualizácie umožňujú jeho sponzori.

V minulej lekcii, Dátum a čas vo Visual Basic .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.

Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!

Ž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! :)


 

 

Článok pre vás napísal Michal Žůrek - misaz
Avatar
Ako sa ti páči článok?
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.
Predchádzajúci článok
Dátum a čas vo Visual Basic .NET
Všetky články v sekcii
Objektovo orientované programovanie vo Visual Basic .NET
Miniatúra
Nasledujúci článok
Diár s databázou vo VB.NET
Aktivity (1)

 

 

Komentáre

Avatar
Michal Žůrek - misaz:3.7.2016 10:06

ten kód funguje, opět tam ale není jedna, ale malé L. Jméno proměnné nemůže začínat číslem, proto je název 1 (jedna) nesmysl.

 
Odpovedať
3.7.2016 10:06
Avatar
Jaroslav Trojan
Redaktor
Avatar
Odpovedá na Michal Žůrek - misaz
Jaroslav Trojan:3.7.2016 15:45

i když tam dám to malé l ,tak to hlásí stejnou chybu
jako předtím/ viz výše/

Odpovedať
3.7.2016 15:45
statik
Avatar
Jaroslav Trojan
Redaktor
Avatar
Jaroslav Trojan:3.7.2016 16:14

proč nejde tento kód:

Module Module1
Public jmeno As String
Public vek As Integer
Public heslo As String
Sub Main()
Dim u As New Uzivatel("Olda Novák", 87, "dům")
Dim a As New Administrator("Jar­da Trojan", 80, "bukovka")
'Dim u As Uzivatel = New Administrator("Jar­da Trojan", 80, "bukovka")
' u = a
' a = u
If TypeOf u Is Administrator Then
Console.Write­Line("je to administrator")
Else
Console.Write­Line("je to uživatel")
End If
Console.Write­Line(u)

Console.Write­Line(a)
Console.WriteLine()
' Uzivatel.Vypis(jme­no,vek,heslo)
Console.Write­Line(Uzivatel­.Vypis(jmeno, vek, heslo))
Console.ReadKey()
End Sub

End Module

třída Uzivatel

Public Class Uzivatel
Public jmeno As String
Public vek As Integer
Public heslo As String

Public Sub New(jmeno As String, vek As Integer, heslo As String)
Me.jmeno = jmeno
Me.vek = vek
Me.heslo = heslo
End Sub

Public Overrides Function ToString() As String
Return jmeno
Return vek
Return heslo
End Function
Public Function Vypis(jmeno, vek, heslo)
Console.Write­Line(jmeno, vek, heslo)
End Function

End Class

Odpovedať
3.7.2016 16:14
statik
Avatar
Odpovedá na Jaroslav Trojan
Michal Žůrek - misaz:3.7.2016 20:52
Dim poleStringu As String={"První","Druhá","Třetí"}
Dim l As New List(Of String) (poleStringu)
Console.WriteLine(l(2))

mě to funguje, otestoval jsem to. Podívej se jakou verzi .NET framework máš nastavenou při vytváření projektu. Je dost možné že starší verze něco z toho neumí. Práce s generickými kolekcemi se napříč verzemi trochu měnila.

 
Odpovedať
3.7.2016 20:52
Avatar
Odpovedá na Jaroslav Trojan
Michal Žůrek - misaz:3.7.2016 20:59

nemáš tam označený komentář Třída Uzivatel. Nikde tam nevidím třídu Administrator, kterou se snažíš používat. Metoda Uzivatel.Vypis je nesmysl. Třída Uzivatel nemá žádnou statickou metodu Vypis. Tu musíš volat na instanci, kterou chceš vypsat. Nějak zvláštně máš napsané WriteLine, když si to zkopíruju do notepad++ tak mi to tam z nějakého důvodu dosadí pomlčku Write-Line. Na úvod se podívej do místních tutoriálu OOP, tam najdeš odpovědi na vše co momentálně potřebuješ.

 
Odpovedať
3.7.2016 20:59
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
Odpovedá na Michal Žůrek - misaz
Michal Žůrek - misaz:3.7.2016 21:02

ups. Teď se dívám, že ten kód fakt nefunguje, protože tam chybí závorky definující že poleStringu je pole.

Dim poleStringu As String() = {"První", "Druhá", "Třetí"}
Dim l As New List(Of String)(poleStringu)
Console.WriteLine(l(2))
Editované 3.7.2016 21:02
 
Odpovedať
3.7.2016 21:02
Avatar
Jaroslav Trojan
Redaktor
Avatar
Odpovedá na Michal Žůrek - misaz
Jaroslav Trojan:4.7.2016 19:10

už jsem to opravil, kód funguje

Odpovedať
4.7.2016 19:10
statik
Avatar
Luboš Běhounek Satik
Autoredaktor
Avatar
Luboš Běhounek Satik:4.7.2016 21:50

Mi někam zmizel komentář, by to chtělo nějakou zprávu typu "váš komentář byl smazán", takhle je to dost matoucí

Odpovedať
4.7.2016 21:50
https://www.facebook.com/peasantsandcastles/
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovedá na Luboš Běhounek Satik
Adam Ježek:5.7.2016 8:36

Přesunul sem to do fóra, tady ten kilometrovej kód neměl co dělat (jen se nějak nevybralo všechno, tak sem zbytek smazal, samotná reakce by tu nedávala smysl)

Odpovedať
5.7.2016 8:36
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
Jaroslav Trojan
Redaktor
Avatar
Jaroslav Trojan:8.7.2016 12:55

Ten první kód s Uživatel a Administrator je také vyřešen, viz lekce 14
Stačilo opravit funkce ToString() a Vypis() , pracuje to bezvadně

Odpovedať
8.7.2016 12:55
statik
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!