In sommige situaties wil je dat een element geen twee keer in een datastructuur terecht kan komen. Je wil bijvoorbeeld dat de lijst met cursussen die deel uitmaakt van een studieprogramma geen tweemaal dezelfde cursus kan bevatten.
In dit geval gebruik je geen List<T>
, maar een HashSet<T>
. Elementen toevoegen doe je met de methode Add
en elementen verwijderen doe je met Remove
. Ook hier beperken we ons voorlopig tot voorgedefinieerde soorten objecten. Wanneer we System.Object
hebben bestudeerd, kunnen we ook HashSet
s van onze eigen types maken.
De immutable variant is ImmutableHashSet.
Een Queue is een collectie van elementen die in een welbepaalde volgorde behandeld moeten worden: van voor naar achter. Vergelijk met een wachtrij bij de bakker: de klant die eerst in de rij staat wordt eerst geholpen, dan steeds de volgende klant tot we aankomen bij de klant die het laatst in de rij is aangesloten. We noemen dit soort van collectie ook wel een First In, First Out oftewel FIFO-collectie: het item dat eerst in de rij is gezet, is ook het eerste dat behandeld wordt.
Een Queue is dus een speciaal soort lijst, waarbij het toevoegen en verwijderen van elementen op de lijst niet op gelijk welke plaats mag gebeuren. Een queue biedt daarom geen Add() of RemoveAt() methode aan. In plaats daarvan gebruik je:
Enqueue(T item)
om een item aan de rij toe te voegen
Dequeue()
om een item uit de rij te halen. Deze methode geeft als returnwaarde het weggehaalde item terug, zodat je er iets mee kan doen.
Peek()
geeft je het eerstvolgende item terug, maar verwijdert het nog niet uit de rij.
Op lijn 18 wordt de volgende klant uit de rij gehaald. Deze klant gebruiken we nog snel om zijn naam te tonen aan de gebruiker, maar na lijn 29 zal deze klant verdwijnen. Wil je deze klant in meer dan één statement gebruiken, zal je hem dus moeten opslaan in een lokale variabele:
Op lijn 20 wordt er eerst 'gespiekt' wie de volgende klant is: Piet. Met Peek()
wordt hij echter nog niet uit de rij gehaald, zoals je in onderstaande output kan zien.
De immutablevariant van Queue is ImmutableQueue.
Het omgekeerde van een Queue is een Stack. Dit is een lijst van items waarbij je steeds het laatst toegevoegde item eerst wilt behandelen. Vergelijk dit met een stapel borden aan de afwas: het eerstvolgende bord dat je afwast, is het bovenste bord op de stapel, dus het laatst toegevoegde. Of met een rij wagens in een lange, smalle garage met maar één toegangspoort: de eerste wagen die kan buitenrijden, is degene die laatst is binnengereden.
Dit noemen we een LIFO-collectie, oftewel Last In, First Out. Waar Queue Enqueue(T item)
en Dequeue()
gebruikte om items toe te voegen en uit de rij te halen, gebruikt Stack
Push(T item)
om een item op de stapel te leggen.
Pop()
om een item van de stapel te nemen.
Peek()
om het bovenste item op de stapel te bekijken, zonder het er af te nemen.
Dit voorbeeld demonstreert de werking van de 'Maak ongedaan' functionaliteit die je hebt in de meeste programma's op je computer. Als je op 'Maak ongedaan' (Engels: undo, commando: Ctrl+Z) klikt, wordt enkel dat wat je als laatste gedaan hebt, teruggedraaid.
Volgend filmpje demonstreert de acties die de gebruiker uitvoert in een tekstbewerkingsprogramma:
De gebruiker neemt volgende stappen, vertrekkende vanaf een wit blad:
Voeg paragraaf toe
Zet tekst in vet
Haal stuk tekst weg
Maak laatste actie ongedaan
Maak tekst groter.
Maak laatste actie ongedaan
Maak tekst kleiner.
Voeg tekst toe.
De code om deze acties bij te houden in een actiehistoriek zou kunnen zijn:
Dit geeft volgende output:
De immutablevariant van Stack is ImmutableStack.