Dela via


Samlingstyper för hashtable och ordlista

Klassen System.Collections.Hashtable och de System.Collections.Generic.Dictionary<TKey,TValue> generiska System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> klasserna implementerar System.Collections.IDictionary gränssnittet. Den Dictionary<TKey,TValue> generiska klassen implementerar också det IDictionary<TKey,TValue> generiska gränssnittet. Därför är varje element i dessa samlingar ett nyckel-och-värde-par.

Ett Hashtable objekt består av bucketar som innehåller elementen i samlingen. En bucket är en virtuell undergrupp med element i Hashtable, vilket gör sökning och hämtning enklare och snabbare än i de flesta samlingar. Varje bucket är associerad med en hash-kod, som genereras med hjälp av en hash-funktion och baseras på -nyckeln för elementet.

Den generiska HashSet<T> klassen är en osorterad samling för att innehålla unika element.

En hash-funktion är en algoritm som returnerar en numerisk hash-kod baserat på en nyckel. Nyckeln är värdet för någon egenskap för objektet som lagras. En hash-funktion måste alltid returnera samma hash-kod för samma nyckel. Det är möjligt för en hash-funktion att generera samma hash-kod för två olika nycklar, men en hash-funktion som genererar en unik hash-kod för varje unik nyckel ger bättre prestanda vid hämtning av element från hash-tabellen.

Varje objekt som används som ett element i ett Hashtable måste kunna generera en hash-kod för sig själv med hjälp av en implementering av GetHashCode metoden. Du kan dock också ange en hash-funktion för alla element i en Hashtable med hjälp av en Hashtable konstruktor som accepterar en IHashCodeProvider implementering som en av dess parametrar.

När ett objekt läggs till i en Hashtablelagras det i bucketen som är associerad med hash-koden som matchar objektets hash-kod. När ett värde söks efter i Hashtablegenereras hash-koden för det värdet och bucketen som är associerad med hash-koden genomsöks.

Till exempel kan en hash-funktion för en sträng ta ASCII-koderna för varje tecken i strängen och lägga till dem tillsammans för att generera en hash-kod. Strängen "picnic" skulle ha en hash-kod som skiljer sig från hash-koden för strängen "korg"; Därför skulle strängarna "picknick" och "korg" vara i olika bucketar. Däremot skulle "stressade" och "desserter" ha samma hashkod och skulle vara i samma bucket.

Klasserna Dictionary<TKey,TValue> och ConcurrentDictionary<TKey,TValue> har samma funktioner som Hashtable klassen. En Dictionary<TKey,TValue> av en viss typ (förutom Object) ger bättre prestanda än en Hashtable för värdetyper. Det beror på att elementen av är av Hashtable typen Object. Därför sker boxning och avboxning vanligtvis när du lagrar eller hämtar en värdetyp. Klassen ConcurrentDictionary<TKey,TValue> ska användas när flera trådar kan komma åt samlingen samtidigt.

Se även