Kako koristiti HashSet u C #

HashSet je optimizirana kolekcija neuređenih, jedinstvenih elemenata koja omogućuje brzo traženje i postavljanje operacija visokih performansi. Klasa HashSet prvi je put predstavljena u .NET 3.5 i dio je prostora imena System.Collection.Generic. Ovaj članak govori o tome kako možemo raditi s HashSetovima u C #.

Da biste radili s primjerima koda iz ovog članka, u sustavu biste trebali instalirati Visual Studio 2019. Ako još nemate kopiju, ovdje možete preuzeti Visual Studio 2019.

Stvorite projekt aplikacije konzole .NET Core u Visual Studiju

Prvo stvorimo projekt .NET Core Console Application u Visual Studiju. Pod pretpostavkom da je Visual Studio 2019 instaliran u vašem sustavu, slijedite korake opisane u nastavku da biste stvorili novi projekt aplikacije .NET Core Console u Visual Studio-u.

  1. Pokrenite Visual Studio IDE.
  2. Kliknite "Stvori novi projekt".
  3. U prozoru "Stvori novi projekt" s popisa predložaka odaberite "Aplikacija konzole (.NET Core)".
  4. Kliknite Dalje.
  5. U sljedećem prozoru "Konfiguriranje novog projekta" navedite naziv i mjesto za novi projekt.
  6. Kliknite Stvori.

To će stvoriti novi projektni program konzole .NET Core u Visual Studio 2019. Ovaj ćemo projekt koristiti za rad s HashSetom u sljedećim odjeljcima ovog članka.

Što je HashSet?

HashSet - koji predstavlja klasa HashSet koji se odnosi na System.Collections.Generic prostor imena - kolekcija jedinstvenih elemenata visokih performansi, neuređena. Stoga HashSet nije sortiran i ne sadrži nikakve ponovljene elemente. HashSet također ne podržava indekse - možete koristiti samo popisivače. HashSet se obično koristi za operacije visokih performansi koje uključuju skup jedinstvenih podataka.

Klasa HashSet implementira nekoliko sučelja kao što je prikazano u nastavku:

javna klasa HashSet: System.Collections.Generic.ICollection,

System.Collections.Generic.IEnumerable,

System.Collections.Generic.IReadOnlyCollection,

System.Collections.Generic.ISet,

System.Runtime.Serialization.IDeserializationCallback,

System.Runtime.Serialization.ISerializable

Budući da HashSet sadrži samo jedinstvene elemente, njegova je unutarnja struktura optimizirana za brže pretraživanje. Imajte na umu da možete pohraniti jednu null vrijednost u HashSet. Dakle, HashSet je dobar izbor kada želite kolekciju koja sadrži jedinstvene elemente i elementi u zbirci mogu se brzo pretraživati.

Pretražite stavku u HashSetu na C #

Da biste pretražili stavku u HashSetu, možete upotrijebiti metodu Contains kao što je prikazano u isječku koda navedenom u nastavku:

statička praznina Main (string [] args)

        {

            HashSet hashSet = novi HashSet ();

            hashSet.Add ("A");

            hashSet.Add ("B");

            hashSet.Add ("C");

            hashSet.Add ("D");

            if (hashSet.Contens ("D"))

                Console.WriteLine ("Traženi element je dostupan.");

            drugo

                Console.WriteLine ("Traženi element nije dostupan.");

            Console.ReadKey ();

        }

HashSet elementi uvijek su jedinstveni

Ako pokušate umetnuti duplicirani element u HashSet, on će se jednostavno zanemariti, ali neće biti izuzeta izvođačka izvedba. Sljedeći isječak koda to ilustrira.

statička praznina Main (string [] args)

{

   HashSet hashSet = novi HashSet ();

   hashSet.Add ("A");

   hashSet.Add ("B");

   hashSet.Add ("C");

   hashSet.Add ("D");

   hashSet.Add ("D");

   Console.WriteLine ("Broj elemenata je: {0}", hashSet.Count);

   Console.ReadKey ();

}

Kada izvršite program, izlaz će biti kao što je prikazano na slici 1.

Sada razmotrite sljedeći isječak koda koji ilustrira kako se uklanjaju duplicirani elementi:

niz [] gradovi = novi niz [] {

                "Delhi",

                "Kolkata",

                "New York",

                "London",

                "Tokio",

                "Washington",

                "Tokio"

            };

            HashSet hashSet = novi HashSet (gradovi);

            foreach (var grad u hashSetu)

            {

                Console.WriteLine (grad);

            }

Kada izvršite gornji program, duplicirani nazivi gradova uklonit će se.

Uklonite elemente iz HashSet-a u C #

Da biste uklonili stavku iz HashSet-a, trebali biste pozvati metodu Remove. Sintaksa metode Remove data je u nastavku.

javni bool Ukloni (T stavka);

Ako je stavka pronađena u zbirci, metoda Remove uklanja element iz HashSet-a i vraća true u slučaju uspjeha, false inače.

Isječak koda dan u nastavku ilustrira kako pomoću metode uklanjanja možete ukloniti stavku iz HashSet-a.

stavka niza = "D";

if (hashSet.Contens (item))

{

   hashSet.Remove (stavka);

}

Da biste uklonili sve stavke iz HashSet-a, možete koristiti metodu Clear.

Upotrijebite metode operacija skupa HashSet u C #

HashSet ima niz važnih metoda za postavljene operacije kao što su IntersectWith, UnionWith, IsProperSubsetOf, ExceptWith i SymmetricExceptWith.

IsProperSubsetOf

Metoda IsProperSubsetOf koristi se za određivanje je li instanca HashSet odgovarajući podskup zbirke. To je prikazano u isječku koda koji je dan u nastavku.

HashSet setA = new HashSet () {"A", "B", "C", "D"};

HashSet setB = new HashSet () {"A", "B", "C", "X"};

HashSet setC = new HashSet () {"A", "B", "C", "D", "E"};

if (setA.IsProperSubsetOf (setC))

   Console.WriteLine ("setC sadrži sve elemente skupaA.");

if (! setA.IsProperSubsetOf (setB))

   Console.WriteLine ("setB ne sadrži sve elemente skupaA.");

Kada izvršite gornji program, trebali biste vidjeti sljedeći izlaz na prozoru konzole.

UnionWith

Za dodavanje skupa koristi se metoda UnionWith, kao što je prikazano u donjem isječku koda.

HashSet setA = new HashSet () {"A", "B", "C", "D", "E"};

HashSet setB = new HashSet () {"A", "B", "C", "X", "Y"};

setA.UnionWith (setB);

foreach (niz str u setA)

{

   Console.WriteLine (str);

}

Kada izvršite gornji dio koda, elementi setB se kopiraju u setA. Tako će setA sada sadržavati "A", "B", "C", "D", "E", "X" i "Y". 

IntersectWith 

Metoda IntersectWith koristi se za predstavljanje presjeka dvaju HashSetova. Evo primjera za razumijevanje ovoga.

HashSet setA = new HashSet () {"A", "B", "C", "D", "E"};

HashSet setB = new HashSet () {"A", "X", "C", "Y"};

setA.IntersectWith (setB);

foreach (niz str u setA)

{

    Console.WriteLine (str);

}

Kada pokrenete gornji program, na prozoru konzole prikazat će se samo elementi zajednički za dva HashSetova. Izlaz bi izgledao ovako: 

OsimWith

Metoda ExceptWith predstavlja matematičko oduzimanje skupa i predstavlja O (n) operaciju. Pretpostavimo da imate dva HashSets setA i setB i da navedete sljedeću izjavu:

setA.ExceptWith (setB);

To bi vratilo elemente skupaA koji nisu prisutni u setuB. Shvatimo to na drugom primjeru. Razmotrite isječak koda dan u nastavku.

HashSet setA = new HashSet () {"A", "B", "C", "D", "E"};

HashSet setB = new HashSet () {"A", "X", "C", "Y"};

setA.ExceptWith (setB);

foreach (niz str u setA)

{

   Console.WriteLine (str);

}

Kada izvršite gornji program, elementi "B", "D" i "E" bit će ispisani na prozoru konzole, kao što je prikazano na slici 5.

SymmetricExceptWith 

Metoda SymmetricExceptWith koristi se za modificiranje HashSet-a tako da sadrži samo jedinstvene elemente dva HashSetova, tj. Elemente koji nisu zajednički za oba HashSetova. Razmotrite sljedeći isječak koda koji to ilustrira.

HashSet setA = new HashSet () {"A", "B", "C", "D", "E"};

HashSet setB = new HashSet () {"A", "X", "C", "Y"};

setA.SymmetricExceptWith (setB);

foreach (niz str u setA)

{

  Console.WriteLine (str);

}

Kada izvršite gornji kod, na prozoru konzole prikazat će se samo jedinstveni elementi skupa setA i setB - tj. Elementi koji su prisutni u setA, ali ne i u setB, i elementi koji su prisutni u setB, ali ne i u setA kako je prikazano na slici 6.

Iako je prosječna složenost pristupa elementu niza O (n), gdje n predstavlja broj elemenata u nizu, složenost je samo O (1) za pristup određenom elementu u HashSetu. To čini HashSet dobrim izborom za brza pretraživanja i za obavljanje postavljenih operacija. Popis možete koristiti ako želite pohraniti zbirku predmeta u određenom redoslijedu, a možda uključite i duplikate. 

Kako učiniti više u C #:

  • Kako koristiti imenovane i neobavezne parametre u C #
  • Kako odrediti C # kod pomoću BenchmarkDotNet-a
  • Kako koristiti tečna sučelja i ulančavanje metoda u C #
  • Kako jedinica testirati statičke metode u C #
  • Kako refaktorirati Božje objekte u C #
  • Kako koristiti ValueTask u C #
  • Kako se koristi nepromjenjivost u C
  • Kako koristiti const, readonly i static u C #
  • Kako koristiti bilješke podataka u C #
  • Kako raditi s GUID-ovima u C # 8
  • Kada koristiti apstraktnu klasu naspram sučelja u C #
  • Kako raditi s AutoMapperom u C #
  • Kako koristiti lambda izraze u C #
  • Kako raditi s delegatima Action, Func i Predicate u C #
  • Kako raditi s delegatima u C #
  • Kako implementirati jednostavni zapisnik u C #
  • Kako raditi s atributima u C #
  • Kako raditi s log4netom na C #
  • Kako implementirati obrazac dizajna spremišta u C #
  • Kako raditi s refleksijom u C #
  • Kako raditi s nadzornikom datoteka u C #
  • Kako izvesti lijenu inicijalizaciju u C #
  • Kako raditi s MSMQ-om u C #
  • Kako raditi s metodama produženja u C #
  • Kako do nas lambda izrazi u C #
  • Kada upotrijebiti hlapljivu ključnu riječ u C #
  • Kako koristiti ključnu riječ yield u C #
  • Kako implementirati polimorfizam u C #
  • Kako izraditi vlastiti planer zadataka u C #
  • Kako raditi s RabbitMQ u C #
  • Kako raditi s korpicom u C #
  • Istraživanje virtualnih i apstraktnih metoda u C #
  • Kako koristiti Dapper ORM u C #
  • Kako koristiti uzorak dizajna muhe u C #