Delen via


Typen hashtabel- en woordenlijstverzameling

De System.Collections.Hashtable klasse en de System.Collections.Generic.Dictionary<TKey,TValue> algemene System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> klassen implementeren de System.Collections.IDictionary interface. De Dictionary<TKey,TValue> algemene klasse implementeert ook de IDictionary<TKey,TValue> algemene interface. Daarom is elk element in deze verzamelingen een sleutel-en-waardepaar.

Een Hashtable object bestaat uit buckets die de elementen van de verzameling bevatten. Een bucket is een virtuele subgroep van elementen binnen de Hashtable, waardoor zoeken en ophalen eenvoudiger en sneller is dan in de meeste verzamelingen. Elke bucket is gekoppeld aan een hash-code, die wordt gegenereerd met behulp van een hash-functie en is gebaseerd op de sleutel van het element.

De algemene HashSet<T> klasse is een niet-geordende verzameling voor het bevatten van unieke elementen.

Een hash-functie is een algoritme dat een numerieke hashcode retourneert op basis van een sleutel. De sleutel is de waarde van een bepaalde eigenschap van het object dat wordt opgeslagen. Een hash-functie moet altijd dezelfde hash-code voor dezelfde sleutel retourneren. Het is mogelijk dat een hash-functie dezelfde hashcode genereert voor twee verschillende sleutels, maar een hash-functie die een unieke hash-code genereert voor elke unieke sleutel resulteert in betere prestaties bij het ophalen van elementen uit de hash-tabel.

Elk object dat als element in een Hashtable element wordt gebruikt, moet een hash-code voor zichzelf kunnen genereren met behulp van een implementatie van de GetHashCode methode. U kunt echter ook een hash-functie opgeven voor alle elementen in een Hashtable met behulp van een Hashtable constructor die een IHashCodeProvider implementatie accepteert als een van de parameters.

Wanneer een object wordt toegevoegd aan een Hashtableobject, wordt het opgeslagen in de bucket die is gekoppeld aan de hashcode van het object die overeenkomt met de hashcode van het object. Wanneer een waarde wordt gezocht in de Hashtablewaarde, wordt de hashcode voor die waarde gegenereerd en wordt de bucket die aan die hashcode is gekoppeld, doorzocht.

Een hash-functie voor een tekenreeks kan bijvoorbeeld de ASCII-codes van elk teken in de tekenreeks overnemen en deze samen toevoegen om een hash-code te genereren. De tekenreeks 'picknick' zou een hash-code hebben die verschilt van de hash-code voor de tekenreeks 'mand'; Daarom zouden de tekenreeksen 'picknick' en 'mand' zich in verschillende emmers bevinden. Daarentegen zouden 'gestrest' en 'desserts' dezelfde hash-code hebben en zich in dezelfde bucket bevinden.

De Dictionary<TKey,TValue> en ConcurrentDictionary<TKey,TValue> klassen hebben dezelfde functionaliteit als de Hashtable klasse. Een Dictionary<TKey,TValue> van een specifiek type (anders dan Object) biedt betere prestaties dan een Hashtable voor waardetypen. Dit komt doordat de elementen Hashtable van het type Objectzijn; daarom vinden boksen en uitpakken meestal plaats wanneer u een waardetype opslaat of ophaalt. De ConcurrentDictionary<TKey,TValue> klasse moet worden gebruikt wanneer meerdere threads tegelijkertijd toegang hebben tot de verzameling.

Zie ook