Ohjelmointi

HashSetin käyttäminen C #: ssä

HashSet on optimoitu kokoelma järjestämättömiä, ainutlaatuisia elementtejä, joka tarjoaa nopean haun ja korkean suorituskyvyn asetetut toiminnot. HashSet-luokka esiteltiin ensimmäisen kerran .NET 3.5: ssä ja se on osa System.Collection.Generic-nimiavaruutta. Tämä artikkeli kertoo kuinka voimme työskennellä HashSetsin kanssa C #: ssä.

Jotta voit työskennellä tässä artikkelissa annettujen koodiesimerkkien kanssa, järjestelmässäsi on oltava asennettuna Visual Studio 2019. Jos sinulla ei vielä ole kopiota, voit ladata Visual Studio 2019 täältä.

Luo .NET Core -konsolisovellusprojekti Visual Studiossa

Luo ensin .NET Core Console -sovellusprojekti Visual Studiossa. Olettaen, että Visual Studio 2019 on asennettu järjestelmään, luo uusi .NET Core Console -sovellusprojekti Visual Studiossa noudattamalla alla olevia ohjeita.

  1. Käynnistä Visual Studio IDE.
  2. Napsauta Luo uusi projekti.
  3. Valitse Luo uusi projekti -ikkunassa ”Console App (.NET Core)” näytetystä malliluettelosta.
  4. Napsauta Seuraava.
  5. Määritä seuraavan projektin nimi ja sijainti uuden Konfiguroi uusi projekti -ikkunassa.
  6. Napsauta Luo.

Tämä luo uuden .NET Core -konsolisovellusprojektin Visual Studio 2019: ssä. Käytämme tätä projektia työskennellessäsi HashSetin kanssa tämän artikkelin seuraavissa osissa.

Mikä on HashSet?

HashSet - jota edustaa System.Collections.Generic-nimiavaruuteen liittyvä HashSet-luokka - on erittäin suorituskykyinen, järjestämätön kokoelma ainutlaatuisia elementtejä. HashSet-sarjaa ei siis lajitella eikä se sisällä päällekkäisiä elementtejä. HashSet ei myöskään tue indeksejä - voit käyttää vain laskijoita. HashSet-sarjaa käytetään yleensä korkean suorituskyvyn operaatioihin, joihin liittyy joukko ainutlaatuisia tietoja.

HashSet-luokka toteuttaa useita käyttöliittymiä alla olevan kuvan mukaisesti:

public class 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

Koska HashSet sisältää vain ainutlaatuisia elementtejä, sen sisäinen rakenne on optimoitu nopeampia hakuja varten. Huomaa, että voit tallentaa yhden nolla-arvon HashSetiin. Joten HashSet on hyvä valinta, kun haluat kokoelman, joka sisältää ainutlaatuisia elementtejä, ja kokoelman elementtejä voidaan etsiä nopeasti.

Hae kohdetta HashSetistä C #: ssä

Voit etsiä kohdetta HashSetistä käyttämällä Sisältää-menetelmää alla olevan koodikatkelman mukaisesti:

staattinen void Main (merkkijono [] args)

        {

HashSet hashSet = uusi HashSet ();

hashSet.Add ("A");

hashSet.Add ("B");

hashSet.Add ("C");

hashSet.Add ("D");

if (hashSet.Contains ("D"))

Console.WriteLine ("Vaadittu elementti on käytettävissä.");

muu

Console.WriteLine ("Vaadittu elementti ei ole käytettävissä.");

Console.ReadKey ();

        }

HashSet-elementit ovat aina ainutlaatuisia

Jos yrität lisätä päällekkäisen elementin HashSetiin, se yksinkertaisesti jätetään huomiotta, mutta ajonaikaisia ​​poikkeuksia ei heitetä. Seuraava koodinpätkä kuvaa tätä.

staattinen void Main (merkkijono [] args)

{

HashSet hashSet = uusi HashSet ();

hashSet.Add ("A");

hashSet.Add ("B");

hashSet.Add ("C");

hashSet.Add ("D");

hashSet.Add ("D");

Console.WriteLine ("Elementtien lukumäärä on: {0}", hashSet.Count);

Console.ReadKey ();

}

Kun suoritat ohjelman, tulos on kuvan 1 mukainen.

Harkitse nyt seuraavaa koodinpätkää, joka kuvaa, kuinka päällekkäiset elementit eliminoidaan:

merkkijono [] kaupungit = uusi merkkijono [] {

"Delhi",

"Kolkata",

"New York",

"Lontoo",

"Tokio",

"Washington",

"Tokio"

            };

HashSet hashSet = uusi HashSet (kaupungit);

foreach (var kaupunki hashSetissä)

            {

Console.WriteLine (kaupunki);

            }

Kun suoritat yllä olevan ohjelman, kaksoiskappaleet poistetaan.

Poista elementit HashSetistä C #: ssä

Poista kohde HashSetistä soittamalla Poista-menetelmään. Poista-menetelmän syntaksi on annettu alla.

public bool Poista (T-kohde);

Jos kohde löytyy kokoelmasta, Poista-menetelmä poistaa elementin HashSetistä ja palauttaa arvon true, jos muuten on false.

Alla annettu koodinpätkä kuvaa, kuinka voit poistaa kohteen HashSetistä poistomenetelmän avulla.

merkkijono = "D";

if (hashSet.Contains (kohde))

{

hashSet.Remove (kohde);

}

Voit poistaa kaikki kohteet HashSetistä käyttämällä Tyhjennä-menetelmää.

Käytä HashSetin asetettuja toimintamenetelmiä kohdassa C #

HashSetillä on joukko tärkeitä menetelmiä joukkooperaatioille, kuten IntersectWith, UnionWith, IsProperSubsetOf, ExceptWith ja SymmetricExceptWith.

IsProperSubsetOf

IsProperSubsetOf-menetelmää käytetään määrittämään, onko HashSet-esiintymä oikea kokoelman osajoukko. Tätä kuvaa alla oleva koodinpätkä.

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

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

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

jos (setA.IsProperSubsetOf (setC))

Console.WriteLine ("setC sisältää kaikki setA: n elementit.");

jos (! setA.IsProperSubsetOf (setB))

Console.WriteLine ("setB ei sisällä kaikkia setA: n elementtejä.");

Kun suoritat yllä olevan ohjelman, sinun pitäisi nähdä seuraava tulos konsoli-ikkunassa.

Unionin kanssa

UnionWith-menetelmää käytetään joukkojen lisäykseen alla olevan koodinpätkän mukaisesti.

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

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

setA.UnionWith (setB);

foreach (merkkijono str setissä A)

{

Console.WriteLine (str);

}

Kun suoritat yllä olevan koodinpätkän, setB: n elementit kopioidaan setA: han. Joten setA sisältää nyt "A", "B", "C", "D", "E", "X" ja "Y".

RisteyttääWith

IntersectWith-menetelmää käytetään kuvaamaan kahden HashSetin risteystä. Tässä on esimerkki tämän ymmärtämiseksi.

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

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

setA.IntersectWith (setB);

foreach (merkkijono str sarjassa A)

{

Console.WriteLine (str);

}

Kun suoritat yllä olevan ohjelman, konsoli-ikkunassa näytetään vain kahdelle HashSet-ryhmälle yhteiset elementit. Tulos näyttäisi tältä:

Paitsi

ExceptWith-menetelmä edustaa matemaattista joukon vähennystä ja on O (n) -operaatio. Oletetaan, että sinulla on kaksi HashSet-sarjaa setA ja setB ja määrität seuraavan lauseen:

setA.ExceptWith (setB);

Tämä palauttaisi joukon A elementit, joita ei ole joukossa B. Ymmärretään tämä toisella esimerkillä. Harkitse alla olevaa koodinpätkää.

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

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

setA.ExceptWith (setB);

foreach (merkkijono str setissä A)

{

Console.WriteLine (str);

}

Kun suoritat yllä olevan ohjelman, elementit "B", "D" ja "E" tulostetaan konsoli-ikkunaan kuvan 5 mukaisesti.

SymmetricExceptWith

SymmetricExceptWith-menetelmää käytetään muokkaamaan HashSet-sarjaa siten, että se sisältää vain kahden HashSetin ainutlaatuiset elementit, eli elementit, jotka eivät ole yhteisiä molemmille HashSets-ryhmille. Harkitse seuraavaa koodinpätkää, joka kuvaa tätä.

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

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

setA.SymmetricExceptWith (setB);

foreach (merkkijono str setissä A)

{

Console.WriteLine (str);

}

Kun suoritat yllä olevan koodin, vain setA: n ja setB: n ainutlaatuiset elementit - eli elementit, jotka ovat setA: ssa mutta eivät setB: ssä, ja elementit, jotka ovat setB: ssä mutta eivät setA: ssa - näkyvät konsoliikkunassa kuten kuvassa 6 on esitetty.

Vaikka matriisin elementin käyttämisen keskimääräinen monimutkaisuus on O (n), missä n edustaa matriisin elementtien lukumäärää, monimutkaisuus on vain O (1) pääsyyn tiettyyn elementtiin HashSetissä. Tämä tekee HashSetistä hyvän valinnan nopeaan hakuun ja asetettujen toimintojen suorittamiseen. Voit käyttää luetteloa, jos haluat tallentaa kokoelman tuotteita tietyssä järjestyksessä ja ehkä sisällyttää myös kaksoiskappaleita.

Kuinka tehdä enemmän C #: ssä:

  • Nimettyjen ja valinnaisten parametrien käyttäminen C #: ssä
  • Kuinka vertailla C # -koodia BenchmarkDotNetin avulla
  • Kuinka käyttää sujuvia rajapintoja ja menetelmäketjua C #: ssä
  • Staattisten menetelmien testaaminen yksikössä C #
  • Kuinka refactor Jumalan esineitä C #
  • Kuinka käyttää ValueTaskia C #: ssä
  • Kuinka käyttää muuttumattomuutta C: ssä
  • Kuinka käyttää const, readonly ja staattinen C #: ssä
  • Tietomerkintöjen käyttäminen C #: ssä
  • Kuinka käyttää GUID-tunnuksia C # 8: ssa
  • Milloin abstraktia luokkaa vs. käyttöliittymää käytetään C #: ssä
  • Kuinka työskennellä AutoMapperin kanssa C #: ssä
  • Kuinka käyttää lambda-lausekkeita C #: ssä
  • Kuinka toimia Action-, Func- ja Predicate-edustajien kanssa C #: ssä
  • Kuinka työskennellä C #: n edustajien kanssa
  • Kuinka toteuttaa yksinkertainen kirjaaja C #: ssä
  • Kuinka työskennellä attribuuttien kanssa C #: ssä
  • Kuinka työskennellä log4netin kanssa C #: ssä
  • Kuinka toteuttaa arkiston suunnittelumalli C #: ssä
  • Kuinka työskennellä heijastuksen kanssa C #: ssä
  • Kuinka työskennellä tiedostojärjestelmän katselijan kanssa C #: ssä
  • Kuinka tehdä laiska alustus C #: ssä
  • Kuinka työskennellä MSMQ: n kanssa C #: ssä
  • Kuinka työskennellä laajennusmenetelmien kanssa C #: ssä
  • Kuinka meille lambda-lausekkeet C #: ssä
  • Milloin haihtuvaa avainsanaa käytetään C #: ssä
  • Tuottoavainsanan käyttäminen C #: ssä
  • Kuinka toteuttaa polymorfismi C #: ssa
  • Kuinka rakentaa oma tehtävän ajastin C #
  • Kuinka työskennellä RabbitMQ: n kanssa C #: ssä
  • Kuinka työskennellä C #: n kanssa
  • Virtuaalisten ja abstraktien menetelmien tutkiminen C #: ssä
  • Kuinka käyttää Dapper ORMia C #: ssä
  • Lentopainokuvion käyttäminen C #: ssä