De HashSet<T>-klasse in C# is een verzameling van unieke waarden zonder een specifieke volgorde. Het wordt gebruikt om snel gegevens op te slaan en op te halen zonder duplicaten. Een HashSet kan nuttig zijn wanneer je alleen unieke elementen nodig hebt, zoals een verzameling unieke gebruikersnamen of unieke identificaties.
In tegenstelling tot lijsten of arrays heeft een HashSet geen vaste volgorde, wat betekent dat elementen niet altijd in dezelfde volgorde worden opgeslagen als waarin ze zijn toegevoegd. Hierdoor werkt de HashSet vaak sneller bij het toevoegen, controleren en verwijderen van elementen.
Waarom gebruik je een HashSet?
Het belangrijkste voordeel van een HashSet is dat deze snelle prestaties biedt bij bewerkingen zoals het controleren of een element al aanwezig is, het toevoegen van unieke elementen en het verwijderen van items. In termen van tijdcomplexiteit biedt een HashSet doorgaans een O(1) (constante tijd) voor deze bewerkingen, wat erg efficiënt is voor grotere datasets.
Gebruik een HashSet wanneer:
Je alleen unieke elementen wilt opslaan.
De volgorde van de elementen niet belangrijk is.
Snelle zoek-, toevoeg- en verwijderbewerkingen vereist zijn.
Een HashSet is vaak handiger dan een List als het gaat om het beheren van een verzameling unieke items zonder de noodzaak van een specifieke volgorde.
Hoe maak je een HashSet?
Een HashSet in C# kan als volgt worden geïnitialiseerd:
HashSet<int> uniekeNummers = new HashSet<int>();
In dit voorbeeld wordt een lege HashSet gemaakt die hele getallen (int) opslaat. Je kunt ook elementen toevoegen tijdens de initiële declaratie:
HashSet<string> namen = new HashSet<string> { "John", "Emma", "Sam" };
Basisbewerkingen van HashSet
Hier zijn enkele van de belangrijkste methoden die je kunt gebruiken met een HashSet:
1. Add
Voegt een item toe aan de HashSet als het nog niet aanwezig is.
HashSet<int> nummers = new HashSet<int>();nummers.Add(5); // Voegt het getal 5 toenummers.Add(5); // Dit doet niets, omdat 5 al aanwezig is
2. Contains
Controleert of een item in de HashSet aanwezig is.
bool bevat5 = nummers.Contains(5); // Retourneert true als 5 aanwezig is
3. Remove
Verwijdert een item uit de HashSet als het aanwezig is.
nummers.Remove(5); // Verwijdert het getal 5 uit de HashSet
4. UnionWith
Voegt de elementen van een andere verzameling toe aan de HashSet zonder duplicaten.
HashSet<int> setA = new HashSet<int> { 1, 2, 3 };HashSet<int> setB = new HashSet<int> { 3, 4, 5 };setA.UnionWith(setB); // setA bevat nu { 1, 2, 3, 4, 5 }
5. IntersectWith
Houdt alleen de elementen over die in beide HashSet-objecten aanwezig zijn.
setA.IntersectWith(setB); // setA bevat nu alleen {3}
6. ExceptWith
Verwijdert de elementen die in een andere verzameling voorkomen uit de HashSet.
setA.ExceptWith(setB); // setA bevat nu {1, 2}
Hoe gebruik je een Set?
In dit voorbeeld gebruiken we een HashSet om een verzameling unieke gebruikersnamen te beheren:
Casus
Stel je wilt alle gebruikte gebruikersnamen bijhouden, zodat je tijdens registratie snel kan controleren of deze al in gebruik is.
Mogelijke uitwerking
HashSet<string> gebruikersnamen = new HashSet<string>(); gebruikersnamen.Add("JohnDoe"); gebruikersnamen.Add("Emma123"); gebruikersnamen.Add("JohnDoe"); // Dubbel, dus wordt niet toegevoegdConsole.WriteLine("Aantal unieke gebruikersnamen: " + gebruikersnamen.Count);
Dit resulteert in:
Aantal unieke gebruikersnamen: 2
Beperkingen van HashSet
Geen volgorde: Elementen in een HashSet hebben geen specifieke volgorde. Als de volgorde van de gegevens belangrijk is, overweeg dan een andere structuur zoals List of SortedSet.
Alleen unieke elementen: Een HashSet staat geen duplicaten toe. Pogingen om een reeds aanwezig element toe te voegen worden genegeerd.
Hoge geheugenbelasting bij grote collecties: Hoewel een HashSet snel is, kan het meer geheugen gebruiken dan sommige andere datastructuren.