Colecția Dictionary
Un alt tip comun de colecție este dicționarul. Un dicționar stochează obiecte care reprezintă perechi cheie-valoare. Clasa Dictionary<K, V> este tipizată cu două tipuri: parametrul K reprezintă tipul cheilor, iar parametrul V reprezintă tipul valorilor.
Crearea și inițializarea unui dicționar
Clasa Dictionary oferă mai mulți constructori pentru crearea unui dicționar. De exemplu, putem crea un dicționar gol:
Dictionary<int, string> people = new Dictionary<int, string>();
Aici, dicționarul people are chei de tip int și valori de tip string.
La definirea unui dicționar, acesta poate fi inițializat direct cu valori:
var people = new Dictionary<int, string>()
{
{ 5, "Tom"},
{ 3, "Sam"},
{ 11, "Bob"}
};
La inițializare se folosește un inițializator - în parantezele acolade după apelarea constructorului se transmit datele inițiale obiectului. În cazul dicționarului, putem transmite un set de elemente, unde fiecare element este închis între paranteze acolade, de exemplu:
{ 5, "Tom"}
Fiecare element reprezintă două valori: prima valoare reprezintă cheia, iar a doua valoare - valoarea elementului. Deoarece în definirea dicționarului people pentru chei este specificat tipul int, iar pentru valori - tipul string, în elementul dicționarului este specificat mai întâi un număr int și apoi un șir de caractere.
Astfel, în cazul de mai sus, elementul are cheia 5 și valoarea "Tom". Ulterior, prin cheia elementului, putem obține valoarea acestuia.
De asemenea, putem folosi o altă metodă de inițializare:
var people = new Dictionary<int, string>()
{
[5] = "Tom",
[6] = "Sam",
[7] = "Bob"
};
În această metodă de inițializare, în parantezele drepte se specifică cheia și se atribuie valoarea elementului. În ansamblu, această metodă de inițializare este echivalentă cu cea precedentă.
KeyValuePair
Fiecare element din dicționar reprezintă o structură KeyValuePair<TKey, TValue>, unde parametrul TKey reprezintă tipul cheii, iar parametrul TValue - tipul valorilor elementelor.
Această structură oferă proprietățile Key și Value, prin care putem obține respectiv cheia și valoarea elementului din dicționar. Una dintre versiunile constructorului Dictionary permite inițializarea dicționarului cu o colecție de obiecte KeyValuePair:
var mike = new KeyValuePair<int, string>(56, "Mike");
var employees = new List<KeyValuePair<int, string>>() { mike };
var people = new Dictionary<int, string>(employees);
Constructorul tipului KeyValuePair acceptă doi parametri - cheia elementului și valoarea acestuia. În acest caz, se creează un astfel de element - mike cu cheia 56 și valoarea "Mike". Acest element este adăugat în lista employees, care apoi este folosită pentru inițializarea dicționarului.
Putem combina ambele metode de inițializare:
var mike = new KeyValuePair<int, string>(56, "Mike");
var employees = new List<KeyValuePair<int, string>>() { mike };
var people = new Dictionary<int, string>(employees)
{
[5] = "Tom",
[6] = "Sam",
[7] = "Bob",
};
În acest caz, dicționarul people va avea patru elemente.
Parcurgerea dicționarului
Pentru parcurgerea dicționarului se poate folosi ciclul foreach:
var people = new Dictionary<int, string>()
{
[5] = "Tom",
[6] = "Sam",
[7] = "Bob"
};
foreach(var person in people)
{
Console.WriteLine($"key: {person.Key} value: {person.Value}");
}
La parcurgere, fiecare element va fi plasat într-o variabilă care reprezintă tipul KeyValuePair, și, folosind proprietățile Key și Value, putem obține cheia și valoarea elementului. Rezultatul în consolă al programului:
key: 5 value: Tom
key: 6 value: Sam
key: 7 value: Bob
Obținerea elementelor
Pentru a accesa elementele din dicționar se folosește cheia lor, care este transmisă între paranteze drepte:
dicționar[cheie]
Astfel putem obține și modifica elementele dicționarului:
var people = new Dictionary<int, string>()
{
[5] = "Tom",
[6] = "Sam",
[7] = "Bob",
};
// obținem elementul cu cheia 6
string sam = people[6]; // Sam
Console.WriteLine(sam); // Sam
// actualizăm valoarea elementului cu cheia 6
people[6] = "Mike";
Console.WriteLine(people[6]); // Mike
// adăugăm un nou element cu cheia 22
people[22] = "Eugene";
Console.WriteLine(people[22]); // Eugene
Astfel, putem adăuga un nou element în dicționar. La setarea unei valori prin cheie, dacă elementul cu această cheie există deja în dicționar, valoarea este actualizată. Dacă nu există un astfel de element în dicționar, elementul este adăugat.
Metode și proprietăți Dictionary
Dintre metodele clasei Dictionary, menționăm următoarele:
- void Add(K key, V value): adaugă un nou element în dicționar
- void Clear(): șterge toate elementele din dicționar
- bool ContainsKey(K key): verifică dacă există un element cu o anumită cheie și returnează true dacă este prezent în dicționar
- bool ContainsValue(V value): verifică dacă există un element cu o anumită valoare și returnează true dacă este prezent în dicționar
- bool Remove(K key): șterge elementul din dicționar cu cheia specificată O altă versiune a acestei metode permite obținerea elementului șters în parametru de ieșire: bool Remove(K key, out V value)
- bool TryGetValue(K key, out V value): obține elementul din dicționar cu cheia key. Dacă reușește, transmite valoarea elementului în parametru de ieșire value și returnează true
- bool TryAdd(K key, V value): adaugă în dicționar un element cu cheia key și valoarea value. La reușită, returnează true
Dintre proprietăți, menționăm proprietatea Count, care returnează numărul de elemente din dicționar.
Aplicarea metodelor:
// carte de telefon ipotetică
var phoneBook = new Dictionary<string, string>();
// adăugăm un element: cheia - număr de telefon, valoarea - numele abonatului
phoneBook.Add("+123456", "Tom");
// alternativ, adăugarea poate fi făcută astfel:
// phoneBook["+123456"] = "Tom";
// Verificarea prezenței
var phoneExists1 = phoneBook.ContainsKey("+123456"); // true
Console.WriteLine($"+123456: {phoneExists1}");
var phoneExists2 = phoneBook.ContainsKey("+567456"); // false
Console.WriteLine($"+567456: {phoneExists2}");
var abonentExists1 = phoneBook.ContainsValue("Tom"); // true
Console.WriteLine($"Tom: {abonentExists1}");
var abonentExists2 = phoneBook.ContainsValue("Bob"); // false
Console.WriteLine($"Bob: {abonentExists2}");
// ștergerea unui element
phoneBook.Remove("+123456");
// verificăm numărul de elemente după ștergere
Console.WriteLine($"Count: {phoneBook.Count}"); // Count: 0