Programmering

Sådan bruges HashSet i C #

Et HashSet er en optimeret samling af uordnede, unikke elementer, der giver hurtige opslag og højtydende sætoperationer. HashSet-klassen blev først introduceret i .NET 3.5 og er en del af System.Collection.Generic navneområdet. Denne artikel taler om, hvordan vi kan arbejde med HashSets i C #.

For at arbejde med kodeeksemplerne i denne artikel skal du have Visual Studio 2019 installeret i dit system. Hvis du ikke allerede har en kopi, kan du downloade Visual Studio 2019 her.

Opret et .NET Core-konsolapplikationsprojekt i Visual Studio

Lad os først oprette et .NET Core Console Application-projekt i Visual Studio. Forudsat at Visual Studio 2019 er installeret i dit system, skal du følge nedenstående trin for at oprette et nyt .NET Core Console Application-projekt i Visual Studio.

  1. Start Visual Studio IDE.
  2. Klik på "Opret nyt projekt."
  3. I vinduet "Opret nyt projekt" skal du vælge "Konsolapp (.NET Core)" fra listen over skabeloner, der vises.
  4. Klik på Næste.
  5. I vinduet "Konfigurer dit nye projekt", der vises nedenfor, skal du angive navnet og placeringen for det nye projekt.
  6. Klik på Opret.

Dette opretter et nyt .NET Core-konsolapplikationsprojekt i Visual Studio 2019. Vi bruger dette projekt til at arbejde med HashSet i de efterfølgende afsnit i denne artikel.

Hvad er et HashSet?

Et HashSet - repræsenteret af HashSet-klassen vedrørende System.Collections.Generic namespace - er en højtydende, uordnet samling af unikke elementer. Derfor sorteres et HashSet ikke og indeholder ingen duplikatelementer. Et HashSet understøtter heller ikke indekser - du kan kun bruge tællere. Et HashSet bruges normalt til højtydende operationer, der involverer et sæt unikke data.

HashSet-klassen implementerer flere grænseflader som vist nedenfor:

offentlig klasse 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

Da HashSet kun indeholder unikke elementer, er dens interne struktur optimeret til hurtigere søgninger. Bemærk, at du kan gemme en enkelt nulværdi i et HashSet. Så HashSet er et godt valg, når du vil have en samling, der indeholder unikke elementer, og elementerne i samlingen kan søges hurtigt.

Søg efter et element i et HashSet i C #

For at søge på et element i et HashSet kan du bruge metoden Indeholder som vist i kodestykket nedenfor:

statisk ugyldigt Main (streng [] args)

        {

HashSet hashSet = nyt HashSet ();

hashSet.Add ("A");

hashSet.Add ("B");

hashSet.Add ("C");

hashSet.Add ("D");

hvis (hashSet.Contains ("D"))

Console.WriteLine ("Det krævede element er tilgængeligt.");

andet

Console.WriteLine ("Det krævede element er ikke tilgængeligt.");

Console.ReadKey ();

        }

HashSet-elementer er altid unikke

Hvis du forsøger at indsætte et duplikatelement i et HashSet, ville det simpelthen blive ignoreret, men ingen runtime-undtagelse kastes. Følgende kodestykke illustrerer dette.

statisk ugyldigt Main (streng [] args)

{

HashSet hashSet = nyt HashSet ();

hashSet.Add ("A");

hashSet.Add ("B");

hashSet.Add ("C");

hashSet.Add ("D");

hashSet.Add ("D");

Console.WriteLine ("Antallet af elementer er: {0}", hashSet.Count);

Console.ReadKey ();

}

Når du udfører programmet, vil output være som vist i figur 1.

Overvej nu følgende kodestykke, der illustrerer, hvordan duplikatelementer elimineres:

streng [] byer = ny streng [] {

"Delhi",

"Kolkata",

"New York",

"London",

"Tokyo",

"Washington",

"Tokyo"

            };

HashSet hashSet = nyt HashSet (byer);

foreach (var by i hashSet)

            {

Console.WriteLine (by);

            }

Når du udfører ovenstående program, fjernes de duplikerede bynavne.

Fjern elementer fra et HashSet i C #

For at fjerne et element fra et HashSet skal du ringe til metoden Fjern. Syntaksen for metoden Fjern er angivet nedenfor.

public bool Fjern (T-element);

Hvis elementet findes i samlingen, fjerner metoden Fjern et element fra HashSet og returnerer sandt efter succes, ellers falsk.

Kodestykket nedenfor illustrerer, hvordan du kan bruge metoden Fjern til at fjerne et element fra et HashSet.

streng element = "D";

hvis (hashSet.Contains (element))

{

hashSet.Remove (element);

}

For at fjerne alle emner fra et HashSet kan du bruge metoden Ryd.

Brug HashSet-sæt-operationsmetoder i C #

HashSet har en række vigtige metoder til at indstille operationer som IntersectWith, UnionWith, IsProperSubsetOf, ExceptWith og SymmetricExceptWith.

IsProperSubsetOf

IsProperSubsetOf-metoden bruges til at bestemme, om en HashSet-forekomst er et korrekt undersæt af en samling. Dette er illustreret i kodestykket nedenfor.

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

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

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

hvis (setA.IsProperSubsetOf (setC))

Console.WriteLine ("setC indeholder alle elementer i setA.");

hvis (! setA.IsProperSubsetOf (setB))

Console.WriteLine ("setB indeholder ikke alle elementer i setA.");

Når du udfører ovenstående program, skal du se følgende output i konsolvinduet.

UnionWith

UnionWith-metoden bruges til sættilsætning som illustreret i nedenstående kodestykke.

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

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

setA.UnionWith (setB);

foreach (streng str i sætA)

{

Console.WriteLine (str);

}

Når du udfører ovenstående stykke kode, kopieres elementerne i setB til setA. Så setA vil nu omfatte "A", "B", "C", "D", "E", "X" og "Y".

Kryds med

IntersectWith-metoden bruges til at repræsentere skæringspunktet mellem to HashSets. Her er et eksempel på at forstå dette.

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

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

setA.IntersectWith (setB);

foreach (streng str i sætA)

{

Console.WriteLine (str);

}

Når du kører ovenstående program, vises kun de elementer, der er fælles for de to HashSets, i konsolvinduet. Outputtet ser sådan ud:

Undtagen med

ExceptWith-metoden repræsenterer matematisk sæt subtraktion og er en O (n) operation. Antag, at du har to HashSets setA og setB, og at du angiver følgende udsagn:

setA.ExceptWith (setB);

Dette vil returnere de elementer i sætA, der ikke er til stede i sætB. Lad os forstå dette med et andet eksempel. Overvej kodestykket nedenfor.

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

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

setA.ExceptWith (setB);

foreach (streng str i sætA)

{

Console.WriteLine (str);

}

Når du udfører ovenstående program, udskrives elementerne "B", "D" og "E" i konsolvinduet som vist i figur 5.

SymmetricExceptWith

SymmetricExceptWith-metoden bruges til at ændre et HashSet, så det kun indeholder de unikke elementer i to HashSets, dvs. de elementer, der ikke er fælles for begge HashSets. Overvej følgende kodestykke, der illustrerer dette.

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

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

setA.SymmetricExceptWith (setB);

foreach (streng str i sætA)

{

Console.WriteLine (str);

}

Når du udfører ovenstående kode, vises kun de unikke elementer i setA og setB - dvs. elementerne, der er til stede i setA, men ikke i setB, og de elementer, der er til stede i setB, men ikke i setA - i konsolvinduet som vist i figur 6.

Mens den gennemsnitlige kompleksitet for adgang til et element i en matrix er O (n), hvor n repræsenterer antallet af elementer i matrixen, er kompleksiteten bare O (1) for at få adgang til et bestemt element i et HashSet. Dette gør HashSet til et godt valg til hurtige søgninger og til udførelse af sætoperationer. Du kan bruge en liste, hvis du vil gemme en samling af varer i en bestemt rækkefølge og måske også inkludere dubletter.

Sådan gør du mere i C #:

  • Sådan bruges navngivne og valgfri parametre i C #
  • Sådan benchmarkes C #-kode ved hjælp af BenchmarkDotNet
  • Sådan bruges flydende grænseflader og metodekædning i C #
  • Sådan enhedstest statiske metoder i C #
  • Sådan refaktorerer du Guds objekter i C #
  • Sådan bruges ValueTask i C #
  • Sådan bruges uforanderlighed i C
  • Sådan bruges const, readonly og static i C #
  • Sådan bruges datanoteringer i C #
  • Sådan arbejder du med GUID'er i C # 8
  • Hvornår skal man bruge en abstrakt klasse vs. interface i C #
  • Sådan arbejder du med AutoMapper i C #
  • Sådan bruges lambda-udtryk i C #
  • Sådan arbejder du med Action-, Func- og Predicate-delegerede i C #
  • Sådan arbejder du med delegerede i C #
  • Sådan implementeres en simpel logger i C #
  • Sådan arbejder du med attributter i C #
  • Sådan arbejder du med log4net i C #
  • Sådan implementeres depotdesignmønsteret i C #
  • Sådan arbejder du med refleksion i C #
  • Sådan arbejder du med filsystemwatcher i C #
  • Sådan udføres doven initialisering i C #
  • Sådan arbejder du med MSMQ i C #
  • Sådan arbejder du med udvidelsesmetoder i C #
  • Hvordan vi lambda-udtryk i C #
  • Hvornår skal du bruge det flygtige nøgleord i C #
  • Sådan bruges afkastnøgleordet i C #
  • Sådan implementeres polymorfisme i C #
  • Sådan bygger du din egen opgaveplanlægning i C #
  • Sådan arbejder du med RabbitMQ i C #
  • Sådan arbejder du med en tuple i C #
  • Udforskning af virtuelle og abstrakte metoder i C #
  • Sådan bruges Dapper ORM i C #
  • Sådan bruges designmønsteret med flyvægt i C #