FUN12. Dictaat C# klassen en collecties versie februari 2015

Vergelijkbare documenten
Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

In de tweede regel plaatsen we in het gereserveerde stukje geheugen een getal.

Een gelinkte lijst in C#

Visual Basic.NET. Visual Basic.NET. M. den Besten 0.3 VB. NET

Uitwerking Tweede deeltentamen Imperatief programmeren - versie 1 Vrijdag 21 oktober 2016, uur

MINICURSUS PHP. Op dit lesmateriaal is een Creative Commons licentie van toepassing Sebastiaan Franken en Rosalie de Klerk Bambara

MINICURSUS PHP. Op dit lesmateriaal is een Creative Commons licentie van toepassing Sebastiaan Franken en Rosalie de Klerk Bambara

Overerving & Polymorfisme

Vakgroep CW KAHO Sint-Lieven

Dieper in Visual Basic.Net

Programmeren in C# Interfaces. Hoofdstuk 23

Dergelijke functionaliteit kunnen we zelf ook aan eigen code toevoegen.

Versie 2: B C D D A C D A C C. Versie 3: C D A A B D A B D D. Versie 4: A D C C B D C B D D. Versie 5: B A D D C A D C A A

Zo gaat jouw kunstwerk er straks uitzien. Of misschien wel heel anders.

Variabelen en statements in ActionScript

Programmeren in C# Samenvatting van C#

Een spoedcursus python

Modelleren en Programmeren

Objectgericht programmeren 1.

Aanvullende toets Gameprogrammeren (INFOB1GP) Woensdag 24 december 2014, uur

Lessen Java: Reeks pag. 1

Je gaat leren programmeren en een spel bouwen met de programmeertaal Python. Websites zoals YouTube en Instagram zijn gebouwd met Python.

Modelleren en Programmeren

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, uur

Modelleren en Programmeren

BEGINNER JAVA Inhoudsopgave

Modelleren en Programmeren

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren

Informatica. Objectgeörienteerd leren programmeren. Van de theorie met BlueJ tot een spelletje met Greenfoot... Bert Van den Abbeele

Labo 2 Programmeren II

Uitwerkingen derde deeltentamen Gameprogrammeren Vrijdag 6 november 2015, uur

Programmeren (1) Examen NAAM:

Uitwerking Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur

Inhoudsopgave Voorwoord 5 Voordat je begint 6 Wat heb je nodig? 7 De website bij het boek 7 Voor ouders, verzorgers en leraren

Online c++ leren programmeren:

Modelleren en Programmeren

Programmeren in Java les 3


Je gaat leren programmeren in Ruby. En daarna in Ruby een spelletje maken. Websites zoals Twitch en Twitter gemaakt zijn met behulp van Ruby?

Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden.

INHOUDSOPGAVE. Over de auteur, de illustrator en de technische redacteuren 13

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

b.text = "Rol!"; b.location = new Point(100, 0); b.click += this.rol; this.paint += this.teken;

Programmeerstructuren met App Inventor

Aan het eind van deze lesbrief wordt uitgelegd wat het nut van OOP is en vind je een aantal oefenopdrachten.

[8] De ene 1 is de andere niet

Voorbeeld: Simulatie van bewegende deeltjes

Tweede deeltentamen Imperatief programmeren versie 1 Vrijdag 20 oktober 2017, uur

Kwis (3) class X { public void a() { System.out.println("x"); public static void main(string[] args) { X x = new X();

Programmeren met Arduino-software

Een topprogrammeur in het OO programmeren is Graig Larman. Hij bedacht de volgende zin:

Lab Webdesign: Javascript 7 april 2008

APPLICATIEBOUW 2E COLLEGE: ONTWERPEN, GEBRUIKERSINTERFACES, VARIABELEN & EXPRESSIES. Onderdeel van SmartProducts

Veel succes! 1. Deze opgave bestaat uit een aantal vragen. Houd het antwoord kort: één of twee zinnen per onderdeel kan al genoeg zijn.

Leren Programmeren met Visual Basic 6.0 Les 3+4. Hoofdstuk 4 : De Selectie

Informatietechnologie 2. JavaScript. Strings, getallen, datums, arrays en loops. Kristof Michiels

VI. Klassen en objecten

Scratch Rekenen & programmeren

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, uur

Uitwerking Tweede deeltentamen Imperatief programmeren Vrijdag 19 oktober 2012, uur

Informatica: C# WPO 2

Veel succes! 1. Gegeven is de volgende klasse:

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 6 november 2015, uur

Programmeermethoden NA. Week 5: Functies (vervolg)

voegtoe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is

Uitwerking Eerste deeltentamen Mobiel programmeren - versie 1 Vrijdag 23 december 2016, uur

Uitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, uur

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 9 november 2018, uur

OEFENINGEN PYTHON REEKS 1

Scala. Korte introductie. Sylvia Stuurman

Programmeermethoden. Pointers. Walter Kosters. week 10: november kosterswa/pm/

Tentamen Object Georiënteerd Programmeren TI januari 2013, Afdeling SCT, Faculteit EWI, TU Delft

Uitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, uur

Programmeren: Visual Basic

[14] Functies. Volg mee via 14_Functies-1.py. We beginnen met een eenvoudig voorbeeldje:

Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk.

Java Les 3 Theorie Herhaal structuren

Hoofdstuk 6: Zelf functies maken

Les 6: Abstractie, methods en parameters in Alice

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10

PYTHON REEKS 1: BASICS. Mathias Polfliet

Kleine cursus PHP5. Auteur: Raymond Moesker

Programmeren. a. 0, 0, 0 b. 0, 0, 27 c. 15, 12, 0 d. 15, 12, 27

NAAM: Programmeren 1 Examen 29/08/2012

Programmeermethoden. Recursie. week 11: november kosterswa/pm/

Derde deeltentamen Gameprogrammeren Vrijdag 7 november 2014, uur

[13] Rondjes draaien (loops)

Objective-C Basis. 23 april 2005, Eindhoven Patrick Machielse

Veel succes! 1. Deze opgave bestaat uit een aantal deelvragen. Houd het antwoord kort: één of twee zinnen per onderdeel kan al genoeg zijn.

Scratch les 1 Rekenen

VAN HET PROGRAMMEREN. Inleiding

6,1. Samenvatting door een scholier 1809 woorden 28 oktober keer beoordeeld. Informatica

Aanvullende toets Gameprogrammeren Woensdag 5 januari 2011, uur

Klonen. Het doel is om de appel op te eten. Iedere keer dat de slang de appel eet, groeit hij één vakje langer.

Stel dat u 15 tellers nodig heeft. Dat kunt u een array van tellers als volgt declareren:

Transcriptie:

FUN12 Dictaat C# klassen en collecties versie februari 2015

INHOUD 1. Inleiding... 3 2. Klassen... 4 2.1. Klassen gebruiken... 4 2.2. Zelf klassen maken... 5 2.3. Je klasse als string... 6 2.4. Voorbeelden... 7 3. Collecties... 9 3.1 Array s... 9 3.2 Lists... 9 3.3 List methodes... 10 3.4 Voorbeelden... 11

1. Inleiding Bij het maken van software loop je al snel tegen het concept object georiënteerd programmeren (OOP) aan. Het is een bepaalde manier van abstractie in je software die destijds (lang geleden) heel veel heel veranderd in de wereld van software programmeren. OOP kom je overal tegen. In embedded systemen (bijvoorbeeld C++), op het web (bijvoorbeeld ASP.NET, Python of PHP), mobiele applicaties (bijvoorbeeld Java, Swift of C#) en desktop applicaties (bijvoorbeeld Java, C# of C++). In elk vakgebied in de ICT is het leren programmeren in een OO programmeertaal van cruciaal belang. Mede vanwege de goede programmeeromgeving Visual Studio, maar zeker ook vanwege het feit dat het een eenvoudige doch krachtige taal betreft, is gekozen voor C# als OO programmeertaal in het startsemester van FHICT. Deze taal wordt in de praktijk ook ontzettend veel gebruikt. Het is niet zo maar een taaltje wat bij Fontys in het eerste jaar wordt ingezet voor educatieve doeleinden. Laten we snel aan de slag gaan, want dat is nodig om te leren programmeren. Veel oefenen en ervaring opdoen. Probeer zo veel mogelijk uit. Fouten maken is nieuwe dingen leren. Niets proberen is niets leren. Dit dictaat gaat kort in op klassen en op twee collectie types in C#. Als voorkennis wordt OIS11 veronderstelt. Beheers je dat nog niet, dan wordt aangeraden daar eerst nog naar te kijken. Succes en veel plezier! 3

2. Klassen Een klasse is een soort blauwdruk. Zie het als een tekening van hoe iets er uit moet gaan zien en wat dat ding kan gaan doen zodra je het daadwerkelijk gaat maken. Van een boot maak je eerst een detaillistische tekening. Wat voor soort hout heb je nodig? Waar liggen de verbindingen? Wat voor een motor komt er in te liggen? Et cetera. Deze tekening, de blauwdruk, kan niet varen. Je kunt er niet op dobberen. Pas wanneer de boot wordt gemaakt kun je er iets mee gaan doen. Je kunt er zelfs meerdere boten van maken! Zo is het met klassen ook. Een klasse is de blauwdruk voor iets. Je kunt er pas mee aan de slag op het moment dat je de blauwdruk instantieert. We gaan eerst naar wat voorbeelden kijken die je al kent. Daarna gaan we zelf een klasse maken. 2.1. Klassen gebruiken Bij OIS11 heb je leren werken met de Random klasse. Dit was al een voorbeeld van zo n blauwdruk. Hieronder zie je een voorbeeld. Random dobbelsteen; dobbelsteen = new Random(); int getal = dobbelsteen.next(); Op de eerste regel wordt een variabele aangemaakt met de naam dobbelsteen. Deze is van het type Random. Nu heb je alleen nog maar gezegd dat de dobbelsteen van het type Random is. Stel je de boot weer voor. De dobbelsteen gaat aangemaakt worden volgens de Random blauwdruk. Je kunt er nu nog niets mee doen! Op de tweede regel wordt de dobbelsteen aangemaakt aan de hand van de blauwdruk van de Random klasse. Vanaf dit punt in de code kan de dobbelsteen gebruikt worden. We zeggen dat dobbelsteen een instantie is van de Random klasse. Dobbelsteen noemen we dan een object (vandaar de term object georiënteerd). In de derde regel zie je dat de dobbelsteen gebruikt wordt om een willekeurig getal op te vragen. Hier gebruik je dus functionaliteit die beschreven staat in de Random klasse. Je gebruikt deze echter niet via de klasse zelf, maar via de instantie van de klasse, namelijk dobbelsteen. Tip: Je krijgt een NullPointerException wanneer je een instantie van een klasse gebruikt zonder dat deze is aangemaakt met new. Je form is een klasse. Aan elke klasse kun je field (variabelen) en methodes toevoegen. Bekijk het volgende voorbeeldje (laat de woorden public, partial en de toevoeging : Form even voor wat het is). public partial class FormDemo : Form public Random dobbelsteen = new Random(); public int GooiDobbelsteen() return dobbelsteen.next(1, 7); private void knopdoeiets_click(object...) int getal = GooiDobbelsteen(); 4

In het voorbeeld is een variabele aan form toegevoegd van het type Random en als naam dobbelsteen. Deze wordt direct, op dezelfde regel nog, geïnitialiseerd. In de rest van het programma kun je de dobbelsteen dus veilig gebruiken. Er is ook een methode aan het form toegevoegd. Deze kan, net als de variabele, overal in deze FormDemo klasse gebruikt worden. Dit wordt ook gedaan bij de klik event handler van de knop. Wanneer de gebruiker op de knop drukt zal er een dobbelsteen worden gegooid. Het willekeurige getal wordt door de GooiDobbelsteen methode teruggegeven. De output van deze methode wordt opgevangen in een integer met de naam getal. Hieronder zie je een ander voorbeeld van het gebruik van een klasse. StringBuilder welkom = new StringBuilder(); welkom.append("welkom "); welkom.append("bij FUN12"); MessageBox.Show(welkom.ToString()); Hier wordt gebruik gemaakt van de StringBuilder klasse. Probeer het bovenstaande stukje code ook even zelf uit. Op de eerste regel code wordt een variabele van het type StringBuilder aangemaakt. De variabele heet welkom. Deze wordt direct, op dezelfde regel nog, geïnitialiseerd. Via de Append methode kunnen er stukken tekst aan worden toegevoegd. Deze wordt in zijn geheel, door de ToString() methode aan te roepen, aan de gebruiker laten zien. Probeer zelf ook wat fields en methodes toe te voegen aan je form. Kijk eens wat je er allemaal mee kunt doen. 2.2. Zelf klassen maken Stel je een boot voor met een snelheid, een naam, een gewicht en een aantal bemanningsleden. De boot kan varen en kan het anker uitgooien. Hoe zou je dit maken in de software? Allerlei variabelen maken en losse methoden? Wat nou als er meerdere boten nodig zijn? Voor dit soort complexe types kunnen we gelukkig ook onze eigen klassen maken. Bekijk het volgende voorbeeld. class Boot public int Snelheid; public string Naam; public int Gewicht; public int AantalBemanningsleden; // Hieronder staan de methodes. public void Varen(int snelheid)... public bool AnkerUitgooien()... In dit voorbeeld zie je als het goed is alle aspecten terug die beschreven stonden in het stukje tekst hierboven. Zo maak je een klasse! Dit kan heel gemakkelijk in Visual Studio door met je rechter muis knop te klikken op je C# project in de Solution Explorer en vervolgens Add > Class te kiezen. Nu kun je een naam voor je klasse ingeven en klaar ben je. Nu kun je fields en methodes toe gaan voegen. Net zoals bij je form. Boot boot = new Boot(); boot.varen(100); MessageBox.Show("De snelheid is " + boot.snelheid); In bovenstaand voorbeeld zie je hoe je een eigen gemaakte klasse kunt gebruiken. Eigen net zoals een variable van het type Random. Je maakt een variabele aan van het juiste type (in dit geval Boot) en initialiseerd deze. 5

Dit gebeurt allemaal op de eerste regel van bovenstaand stukje code. Nu kun je de variable gebruiken! Je kunt er methodes van aanroepen, zoals Varen. Ook kun je eigenschappen opvragen, zoals Snelheid. Boot fldutch = new Boot(); Boot titanic = new Boot(); fldutch.snelheid = 120; titanic.snelheid = 10; Tot slot kun je hierboven een van de meest krachtige aspecten van OOP zien. Elke klasse kun je gebruiken om meerdere instanties van te maken. Nu heb ik twee boten in mijn code! Elke boot met zijn eigen invulling. Zo kan ik heel gemakkelijk boten toevoegen in de code. Probeer eens je eigen klasse te maken en te gebruiken! Wat kun je verzinnen en wat ga je er mee doen? 2.3. Je klasse als string Soms wil je de instantie die je hebt gemaakt van je eigen klasse afbeelden als string. Bijvoorbeeld om in een ListBox te zetten. Gelukkig heeft C# daar de ToString methode voor bedacht. Elke klasse heeft deze methode. Probeer maar uit. Boot b = new Boot(); string bootstring = b.tostring(); MessageBox.Show(bootString); Zoals je in de screenshot aan de rechterkant van de pagina al kunt zien is dit nog niet erg nuttig te noemen. Dit is wat de standaard ToString methode met je klasse doet. Gelukkig kunnen we daar zelf een meer bruikbare definitie aan geven. Bekijk het onderstaande stukje code. public override string ToString() StringBuilder sb = new StringBuilder(); sb.appendformat("0: 1 knopen, 2 ton, max. 3 man.", Naam, Snelheid, Gewicht, AantalBemanningsleden); return sb.tostring(); Hier zie je een ToString methode die wat meer gegevens over de boot zal weergeven. Dit is ook te zien in onderstaande screenshot. Deze ToString methode kun je gewoon copy pasten in je Boot klasse. Nadat je dat gedaan hebt kun je de nieuwe ToString methode gebruiken en uitproberen. Let op dat je het override keyword ook meeneemt in de methode definitie. Daarmee weet C# dat je de standaard ToString methode wilt herschrijven. Die was toch al niet zo nuttig. Dus je eigen invulling is vast beter. 6

De ToString methode is ook handig om een andere reden. C# gebruikt die namelijk in de weergave van je objecten. Bekijk wat er is gebeurd in het volgende voorbeeld. Boot b = new Boot();... lbboten.items.add(b); Op het moment dat je een boot toevoegd aan de ListBox zal C# voor jou de ToString methode aanroepen en deze gebruiken in de weergave. De ListBox zelf bevat de gehele instantie, niet alleen maar de string. Best handig dus! Ga zelf aan de slag met de ToString methode en probeer deze uit in verschillende klassen die je zelf hebt gemaakt. Kun je deze dan ook in een ListBox zetten? 2.4. Voorbeelden Voorbeeld class Aapje public string Soort; public int Leeftijd; public string MaakGeluid() return "Oek oek oek"; public override string ToString() return Soort + " zegt " + MaakGeluid(); class DierenVerzorger public string Naam; public DateTime InDienstSinds; public bool Verzorg(Aapje aap) // Verzorg aapje... Console.Out.WriteLine( aap.maakgeluid() ); return true; Uitleg Hier wordt een klasse Aapje gemaakt. Elk aapje wat je aanmaakt in de code is van een bepaalde soort en heeft een leeftijd. De leeftijd is een geheel getal (integer) en het soort aap is een string. Maak een aapje aan met: Aapje kong = new Aapje(); kong.soort = "Gorilla"; Elk aapje kan ook als string worden weergegeven met de ToString methode. Probeer eens uit: Console.Out.WriteLine(kong); Hier zie je een nieuwe class, DierenVerzorger. Deze heeft een naam en een datum van indiensttreding. Elke verzorger kan ook een aapje verzorgen. Zo zie je dat je ook andere klassen die je maakt kunt gebruiken in zelfgemaakte klassen: DierenVerzorger verzorger = new DierenVerzorger(); verzorger.naam = "Henk"; verzorger.verzorg(kong); Probeer zelf de verzorger eens een datum te geven voor zijn of haar indiensttreding. DateTime is ook een klasse. 7

class Speler public string Naam; public int AantalLevens; public int Score; public void VerdienPunten(int punten) if (IsGameOver() == false) Score = Score + punten; public void VerliesLeven() if (IsGameOver() == false) AantalLevens = AantalLevens 1; public bool IsGameOver() if (AantalLevens <= 0) return true; else return false; Hier links zie je een klasse voor een speler in een game. Elke speler heeft een naam, een huidige score en een aantal levens. Er zijn drie methoden. Met de VerdienPunten methode kan een bepaald aantal punten worden toegevoegd aan de score van de speler. Dit kan echter alleen maar wanneer de speler nog niet game over is. Een speler is game over wanneer het aantal levens 0 of lager is. De speler verliest punten met de VerliesLeven methode. Deze zal het aantal levens met 1 verlagen wanneer de speler nog niet game over is. Wat is de totaalscore van Scott in na het uitvoeren van het stukje code op de volgende pagina? Voer de code uit ter controle! Speler s = new Speler(); s.naam = "Scott Pilgrim"; s.aantallevens = 3; while (s.isgameover() == false) s.verdienpunten(100); s.verliesleven(); Console.Out.WriteLine( s.naam + ": " + s.score ); 8

3. Collecties C# kent, net als de meeste andere programmeertalen, naast klassen nog meer complexe datatypes. Twee voorbeelden daarvan zijn array s en lists. Beide types zijn bedoeld om meerdere waardes van een type te kunnen bewaren. Bijvoorbeeld een verzameling getallen, een lijst van strings of een aantal boten. Soms weet je van te voren niet hoeveel waardes je precies moet onthouden en soms zijn het er gewoon te veel om allemaal op te slaan als losse variabelen. Dit zijn allemaal goede redenen om collecties te gebruiken. We kijken eerst naar array s. Dit is het basistype om meerdere waardes van een en hetzelfde type te kunnen bewaren. Dit datatype werkt ook in de niet object georiënteerde programmeertalen, zoals bijvoorbeeld C. 3.1 Array s Bekijk het volgende voorbeeldje: double[] getallen = new double[10]; getallen[0] = 2.5; MessageBox.Show("Getal nummer 1 = " + getallen[0]); Hier wordt een array van doubles aangemaakt. Om precies te zien een array van precies 10 doubles. Op de tweede regel code wordt het eerste getal in de rij gelijk gemaakt aan 2,5. Met de [blokhaken] kun je elementen een nieuwe waarde geven. Ook kun je getallen opvragen met de [blokhaken]. Dit zie je op de regel daaronder, in de messagebox. Simpel toch? Wat voor getallenreeks wordt er in onderstaand stukje code dan opgeslagen in de array? int[] getallen = new int[10]; for (int i = 0; i < getallen.length; i++) getallen[i] = (i + 1) * 5; Zoals je ziet heeft een array altijd een vaste grootte. In beide voorbeelden hierboven wordt plek gereserveerd voor 10 getallen (doubles of integers). Met de Length eigenschap van een array (ook te zien in bovenstaande stukje code) kun je opvragen hoeveel elementen je maximaal in de array kunt opslaan. Uiteraard kun je ook andere zaken dan integers en doubles opslaan met een array. Zo kun je bijvoorbeeld ook een array van strings of je eigen objecten aanmaken. Probeer eens uit! Een array kan wel altijd maar 1 soort (type) variabele opslaan. Net als bij klassen moet je een array aanmaken met new. Wanneer je dat niet doet krijg je daar van Visual Studio een melding over. Als je niet array probeert te benaderen tijdens de programmauitvoering zond Let op: We beginnen te tellen bij 0. Het eerste element in een array staat op positie 0. Het getal op index 5 is het zesde getal in de reeks. Breinbrekers: Wist je dat een string eigenlijk een char[] array is? En wist je dat je ook een array van array s (van array s (van array s )) kunt maken (2D en 3D array s)? Leuke uitdagingen om mee te spelen! 3.2 Lists Het nadeel van een array is dat je van te voren moet specificeren hoeveel plekken je wilt reserveren voor je data. Echter, niet altijd is dit van te voren bekend. Wanneer je een gebruiker zelf elementen laat toevoegen in het systeem weet je niet hoeveel er toegevoegd zullen worden. Daarom is de List bedacht: de meegroeiende array. Wanneer je meer plek nodig hebt zal de List automagisch groeien in maximale grootte. 9

int[] getallen = new int[10]; for (int i = 0; i < 10; i++) getallen[i] = i * i; getallen[10] = 10 * 10; In bovenstaand stukje code worden een array van maximaal 10 integers aangemaakt. Vervolgens worden de tafel van 10 getal voor getal aan de array toegevoegd. Na de for loop wordt het laatste element aan de array toegevoegd, 10 x 10. Echter, deze zal niet meer passen. Er kunnen maximaal 10 integers in de array en 0 x 10 tot en met 9 x 10 zijn al toegevoegd. Dat zijn er dus al 10 in totaal. Het getal 100 zal niet meer passen en geeft dan een IndexOutOfRangeException foutmelding. In onderstaand voorbeeld wordt een alternatief met een List gegeven. List<int> getallen = new List<int>(); for (int i = 0; i < 10; i++) getallen.add(i * i); getallen.add(10 * 10); Dit stuk code zal niet meer de aangeven dat er geen plek meer is voor het getal 100. De List groeit mee met de vraag. Als er meer plek nodig is zal de List dus plek vrijmaken. Een array kan dit niet uit zichzelf! Hieronder zie je een voorbeeld met een List van strings. In plaats van de for loop wordt de foreach gebruik. Dit is een nieuw soort herhalingsstructuur waarin er om de loop al een element uit de collectie wordt gehaald om er mee verder te werken. Dit scheelt dus weer code! Dit werkt overigens ook met array s. string s = ""; List<string> woorden = new List<string>(); woorden.add("hallo"); woorden.add("allemaal!"); foreach (var woord in woorden) s = s + woord + " "; MessageBox.Show(s); Waarschijnlijk zie je het al, maar de tekst Hallo allemaal! zal verschijnen in een MessageBox. Bij elke iteratie (elke keer dat C# door de collectie loopt) pakt hij het volgende element uit de verzameling. Deze stopt hij in de variabele woord. Deze variable bevat altijd het element wat op dat moment actueel is in de herhaling. Hij pakt dus eest element met index 0, daarna die met index 1, index 2, en zo voorts. Je hoeft dus niet zelf meer de index bij te houden en ook het element wordt automatisch voor je uit de collectie gepakt. 3.3 List methodes Het leuke van alles opslaan in een List is dat je er gemakkelijk elementen in terug kunt vinden. Daar gebruiken we twee methodes voor, de Contains en IndexOf. Met de Contains methode kun je controleren of een element voorkomt in de List. Deze geeft dus true of false terug. De IndexOf methode geeft de index terug van het element dat je zoekt. Als het element niet is gevonden zal 1 terug worden gegeven. 10

List<string> talen = new List<string>(); talen.add("java");... if (talen.contains("c#")) MessageBox.Show("C# komt voor in de lijst!"); In bovenstaand voorbeeld wordt het gebruik van de Contains methode laten zien. Aan de talen List worden verschillende strings toegevoegd. Allereerst wordt de string Java aan de List toegevoegd. Op de drie puntjes kunnen nog andere talen zijn toegevoegd. Als je weet dat een bepaald element in de List voorkomt kun je met de IndexOf methode kijken op welke index het element staat. Bekijk onderstaand voorbeeld. List<string> talen = new List<string>(); talen.add("java");... int index = talen.indexof("c#"); MessageBox.Show("C# staat op index " + index); Wanneer C# niet in de lijst zou staat zou de IndexOf methode aangeven dat de index gelijk is aan 1. Dat is een code die wordt gebruikt wanneer het element waarvan de index van wordt opgevraagd niet wordt gevonden in de List. Dat kun je natuurlijk ook voorkomen door eerst met Contains te kijken of het element voorkomt in de List. Probeer het eens zelf uit en kijk of je de twee kunt combineren! Tip: De Contains en IndexOf methodes werken ook voor strings! 3.4 Voorbeelden Voorbeeld public List<int> GeefTafelVan(int tafelvan) List<int> getallen = new List<int>(); for (int i = 0; i <= 10; i++) getallen.add(i * tafelvan); return getallen; char[] woord = 'H','a','l','l','o','!' ; for (int i = 0; i < woord.length; i++) Console.Out.Write(woord[i]); Console.Out.Write(Environment.NewLine); Uitleg In de code hier links zie je een methode die de tafel van een getal teruggeeft, in de vorm van een List van integers. Je zou deze als volgt kunnen gebruiken: List<int> tafelvanvijf = GeefTafelVan(5); foreach (var getal in tafelvanvijf) Console.Out.WriteLine(getal); Hier links zie je een stukje code om een array van characters op te slaan. Met een for loop kun je de gegevens ophalen en afdrukken naar de console. Probeer het zelf eens uit! 11

List<double> inworp = new List<double>(); inworp.add(.5); inworp.add(2.0); inworp.add(.5); if (inworp.contains(.5)) MessageBox.Show("Er is minstens 1 " + "muntstuk van vijftig cent ingeworpen!"); List<double> inworp = new List<double>(); if (inworp.indexof(.5) == 1) MessageBox.Show("Er is geen muntstuk " + "van vijftig cent ingeworpen!"); Aan de linkerkant zie je een stukje code met een lijst van prijzen, opgeslagen als lijst van doubles. Wanneer een gebruiker een muntstuk van 50 cent heeft ingeworpen zal er een MessageBox worden weergegeven. Bijna hetzelfde voorbeeld als hierboven. Hier wordt de IndexOf methode gebruikt om de index van het eerste vijftig cent munstuk in de lijst op te vragen. Als deze 1 teruggeeft is er geen muntstuk van vijftig cent gevonden. 12