Az asszociatÃv tömb a tömb egy speciális esete. Kulcs-érték párokat tárolunk. Minden kulcshoz egy érték tartozik. A kulcs azonban bármilyen komplex tÃpus lehet, nem csak egész szám. Ez a .NET nyelvben a GetHashCode() metódus miatt lehetséges. Éppen ezért fontos, ha asszociatÃv tárolásban szeretnénk használni a saját tÃpusunkat, akkor megfelelÅ‘en definiáljuk felül a metódust.
A .NET keretrendszerben az asszociatÃv tömb működést a Dictionary<TKey, TValue> osztály valósÃtja meg. BelsÅ‘ szerkezetében ez egy olyan HashSet -szerű tömb, amiben az indexelés kulcsai a TKey tÃpusú elemek lesznek. FelépÃtésbÅ‘l adódóan gyorsan megkereshetÅ‘ egy adott kulcshoz tartozó érték, ennek a fordÃtottja azonban már nem mondható el.
Abban az esetben, ha egy olyan kulcsra hivatkozunk, ami a tömbben nem szerepel, akkor kivételt kapunk, valamint akkor is, ha már egy létezÅ‘ kulcshoz szeretnénk újabb értéket rendelni az Add metódus segÃtségével.
A Dictionary<TKey, TValue> osztály fontosabb tulajdonságai és metódusai:
Dictionary(int capacity)
Paraméteres konstruktor. A paraméter a kiindulásként tárolni kÃvánt elemek számát adja meg.
KeyCollection Keys { get; }
A kulcsokat adja vissza egy kollekcióban. A kollekció csak foreach ciklussal járható be.
ValueCollection Values { get; }
A tárolt értékeket adja vissza egy kollekcióban. A kollekció csak foreach ciklussal járható be.
void Add(TKey key, Value value)
Kulcs és érték rögzÃtése a kollekcióban. Ha a megadott kulcs már létezik a kollekcióban, akkor ArgumentException hibát dob. Abban az esetben, ha a kulcs null, akkor pedig ArgumentNullException kivételbe ütközünk.
bool ContainsKey(TKey key)
Igaz értéket ad vissza, ha a paraméterként megadott kulcs szerepel a tömbben.
bool ContainsValue(TValue value)
Igaz értéket ad vissza, ha a paraméterként megadott érték szerepel a tömbben.
bool Remove(TKey key)
A paraméterként megadott kulcs és a hozzá tartozó érték eltávolÃtása a kollekcióból. Igaz értéket ad vissza, ha a művelet sikerült. Hamis értéket ad vissza abban az esetben, ha nem sikerült a művelet, vagy a kulcs nem található a tömbben.
bool TryGetValue(TKey key, out TValue value)
Kivételkezelt érték lekérdezÅ‘ metódus. Az elsÅ‘ paraméter a kulcsot határozza meg, a második pedig azt a változót, amibe a kulcshoz társÃtott érték kerül. A metódus visszatérési értéke igaz, ha a kulcshoz tartozik érték, hamis ha nem.
Az alábbi példaprogram a Dictionary<TKey, TValue> osztály használatát mutatja be:
using System;
using System.Collections.Generic;
namespace PeldaDictionary
{
class Program
{
static void Main(string[] args)
{
var r = new Random();
var statisztika = new Dictionary<int, int>(15);
for (int i=0; i<30; i++)
{
var generalt = r.Next(0, 15);
if (statisztika.ContainsKey(generalt))
{
statisztika[generalt] += 1;
}
else
{
statisztika.Add(generalt, 1);
}
}
foreach (var elem in statisztika)
{
Console.WriteLine("{0:00} => {1:00} db", elem.Key, elem.Value);
}
Console.ReadKey();
}
}
}
A program egy lehetséges kimenete:
00 => 01 db
01 => 01 db
06 => 03 db
09 => 02 db
12 => 01 db
08 => 02 db
02 => 03 db
03 => 03 db
14 => 03 db
13 => 05 db
10 => 04 db
11 => 02 db
FrozenDictionary
A .NET 8 egyik új tÃpusa a FrozenDictionary<TKey,TValue>, ami egy csak olvasható asszociatÃv tömböt valósÃt meg. Kifejezetten olyan használati esetekre van optimalizálva, ahol többször fordul elÅ‘ a szótár olvasása, mint Ãrása. Ezen kollekció a System.Collections.Frozen névtérben található és ugyanúgy használható, mint egy hagyományos Dictionary tÃpus, kivéve, hogy menet közben a tartalma nem módosÃtható.