Există două tipuri de seturi în domeniul de definiție System.Collections.Generic: SortedSet și HashSet. Ambele oferă funcționalitatea de stocare a elementelor care nu sunt duplicate. Principala diferență dintre ele este faptul că SortedSet are în mod evident articolele sortate. Prin urmare, dacă nu vă interesează ordinea în care sunt stocate elementele, vă recomand să utilizați HashSet, pentru o performanță ușor mai bună. Va fi ușor mai rapidă. În comparație cu o listă, un HashSet are o adăugare mai înceată a elementelor. Cu toate acestea, căutarea, citirea sau ștergerea elementelor este mult, mult mai rapidă, datorită utilizării algoritmilor de hash asupra elementelor.
HashSet nu are o capacitate setată. Capacitatea sa crește odată cu adăugarea de elemente.
Putem atribui direct elementele unui array unui set HashSet, iar intrările duplicate vor fi eliminate:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
using System; using System.Collections.Generic; namespace HelloWorld { class Program { static void Main(string[] args) { Console.WriteLine("Utilizarea HashSet"); // Defineste un array de tip string (observati elementele duplicat!) string[] nume = new string[] { "pisica", "caine", "pisica", "pasare", "vaca", "cal", "pisica" }; // Afiseaza marimea array-ului si elementele sale Console.WriteLine("Numarul de elemente din array " + nume.Length); Console.WriteLine(); Console.WriteLine("Datele din Array"); foreach (var n in nume) Console.WriteLine(n); Console.WriteLine(); // Defineste un HashSet prin atribuirea array-ului de tip string HashSet<string> hashSet = new HashSet<string>(nume); // Afiseaza numarul de elemente din HashSet Console.WriteLine("Numarul de elemente din HashSet " + hashSet.Count); Console.WriteLine(); // Afiseaza elementele din HashSet, dovedind ca elementul duplicat „pisica” a fost eliminat Console.WriteLine("Datele din HashSet"); foreach (var n in hashSet) Console.WriteLine(n); Console.ReadLine(); } } } |
Structura de date HashSet nu accepta elemente duplicat, și astfel rezultatul va afișa numarul elementelor sale ca fiind mai mic decât cel din array. Ieșirea va arăta astfel:
Cele mai importante metode ale clasei HashSet sunt următoarele:
UnionWith() – putem folosi această metodă pentru a uni (îmbina) elementele deja conținute într-un HashSet cu elementele unei alte colecții.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
using System; using System.Collections.Generic; namespace BunaLume { class Program { private static void Main(string[] args) { string[] nume1 = new string[] { "Ion", "Popescu", "Ion", "Cristi", "Ana", "Ciprian" }; string[] nume2 = new string[] { "Madalina", "Sara", "Edi", "Maria", "Ion", "Sara" }; HashSet<string> hashSet1 = new HashSet<string>(nume1); Console.WriteLine("Datele din primul HashSet"); foreach (var nume in hashSet1) Console.WriteLine(nume); Console.WriteLine("_______________________________________________________________"); HashSet<string> hashSet2 = new HashSet<string>(nume2); Console.WriteLine("Datele din al doilea HashSet"); foreach (var nume in hashSet2) Console.WriteLine(nume); Console.WriteLine("________________________________________________________________"); Console.WriteLine("Datele dupa uniune"); hashSet1.UnionWith(hashSet2); foreach (var n in hashSet1) Console.WriteLine(n); Console.ReadLine(); } } } |
Rezultatul va fi acesta:
Observați că elementele duplicat au fost eliminate din HashSet-ul fuzionat.
ExceptWith() – Această metodă este complementara metodei UnionWith() – va elimina toate elementele care sunt conținute în ambele structuri de date, inclusiv elementele duplicate.
SymmetricExceptWith() – Aceasta modifică HashSet-ul final pentru a include numai rezultatele care sunt prezente într-unul din HashSet-uri, dar nu ambele. Toate elementele care se potrivesc vor fi eliminate.
Cea mai importantă proprietate a HashSet este:
Count – returnează un număr întreg reprezentând numărul total de elemente din HashSet.
Tags: hashset, structuri de date