Programování

Jak používat HashSet v C #

HashSet je optimalizovaná kolekce neuspořádaných jedinečných prvků, které poskytují rychlé vyhledávání a vysoce výkonné operace se sadami. Třída HashSet byla poprvé představena v .NET 3.5 a je součástí oboru názvů System.Collection.Generic. Tento článek hovoří o tom, jak můžeme pracovat s HashSets v C #.

Chcete-li pracovat s příklady kódu uvedenými v tomto článku, měli byste mít ve svém systému nainstalovanou Visual Studio 2019. Pokud ještě nemáte kopii, můžete si stáhnout Visual Studio 2019 zde.

Vytvořte projekt aplikace konzoly .NET Core v sadě Visual Studio

Nejprve si vytvořme projekt konzolové aplikace .NET Core v sadě Visual Studio. Za předpokladu, že je ve vašem systému nainstalovaná sada Visual Studio 2019, postupujte podle níže uvedených kroků a vytvořte nový projekt konzolové aplikace .NET Core v sadě Visual Studio.

  1. Spusťte Visual Studio IDE.
  2. Klikněte na „Vytvořit nový projekt“.
  3. V okně „Vytvořit nový projekt“ vyberte ze zobrazeného seznamu šablon „Console App (.NET Core)“.
  4. Klikněte na Další.
  5. V dalším okně „Konfigurace nového projektu“ zadejte název a umístění nového projektu.
  6. Klikněte na Vytvořit.

Tím se vytvoří nový projekt aplikace konzoly .NET Core v sadě Visual Studio 2019. Tento projekt použijeme pro práci s HashSet v následujících částech tohoto článku.

Co je HashSet?

HashSet - představovaný třídou HashSet týkající se oboru názvů System.Collections.Generic - je vysoce výkonná neuspořádaná kolekce jedinečných prvků. Sada HashSet proto není tříděna a neobsahuje žádné duplicitní prvky. Sada HashSet také nepodporuje indexy - můžete použít pouze výčty. HashSet se obvykle používá pro vysoce výkonné operace zahrnující sadu jedinečných dat.

Třída HashSet implementuje několik rozhraní, jak je znázorněno níže:

veřejná třída 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

Protože HashSet obsahuje pouze jedinečné prvky, je jeho vnitřní struktura optimalizována pro rychlejší vyhledávání. Všimněte si, že můžete uložit jednu hodnotu null v HashSet. HashSet je tedy dobrou volbou, když chcete kolekci, která obsahuje jedinečné prvky a prvky v kolekci lze rychle prohledat.

Hledat položku v HashSet v C #

Chcete-li vyhledat položku v HashSet, můžete použít metodu Contains, jak je ukázáno v níže uvedeném fragmentu kódu:

static void Main (řetězec [] args)

        {

HashSet hashSet = nový HashSet ();

hashSet.Add ("A");

hashSet.Add ("B");

hashSet.Add ("C");

hashSet.Add ("D");

if (hashSet.Contains ("D"))

Console.WriteLine („Je k dispozici požadovaný prvek.“);

jiný

Console.WriteLine („Požadovaný prvek není k dispozici.“);

Console.ReadKey ();

        }

Prvky HashSet jsou vždy jedinečné

Pokud se pokusíte vložit duplicitní prvek do HashSet, jednoduše by to bylo ignorováno, ale nebude vyvolána žádná runtime výjimka. Následující fragment kódu to ilustruje.

static void Main (řetězec [] args)

{

HashSet hashSet = nový HashSet ();

hashSet.Add ("A");

hashSet.Add ("B");

hashSet.Add ("C");

hashSet.Add ("D");

hashSet.Add ("D");

Console.WriteLine ("Počet prvků je: {0}", hashSet.Count);

Console.ReadKey ();

}

Po spuštění programu bude výstup zobrazen na obrázku 1.

Nyní zvažte následující fragment kódu, který ilustruje, jak jsou odstraněny duplicitní prvky:

řetězec [] města = nový řetězec [] {

"Dillí",

"Kalkata",

"New York",

"Londýn",

"Tokio",

"Washington",

"Tokio"

            };

HashSet hashSet = nový HashSet (města);

foreach (var město v hashSet)

            {

Console.WriteLine (město);

            }

Když provedete výše uvedený program, duplicitní názvy měst budou odstraněny.

Odebrání prvků z HashSet v C #

Chcete-li odebrat položku z HashSet, měli byste zavolat metodu Remove. Syntaxe metody Remove je uvedena níže.

public bool Odebrat (položka T);

Pokud je položka nalezena v kolekci, Remove metoda odebere prvek z HashSet a vrátí true při úspěchu, false jinak.

Fragment kódu uvedený níže ukazuje, jak můžete použít metodu Remove k odebrání položky z HashSet.

string item = "D";

if (hashSet.Contains (item))

{

hashSet.Remove (položka);

}

Chcete-li odebrat všechny položky ze sady HashSet, můžete použít metodu Vymazat.

Použít HashSet nastavit metody operací v C #

HashSet má řadu důležitých metod pro operace sady, jako jsou IntersectWith, UnionWith, IsProperSubsetOf, ExceptWith a SymmetricExceptWith.

IsProperSubsetOf

Metoda IsProperSubsetOf se používá k určení, zda je instance HashSet správnou podmnožinou kolekce. To je znázorněno na fragmentu kódu uvedeném níže.

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 obsahuje všechny prvky setA.");

if (! setA.IsProperSubsetOf (setB))

Console.WriteLine ("setB neobsahuje všechny prvky setA.");

Když spustíte výše uvedený program, měli byste vidět následující výstup v okně konzoly.

UnionWith

Metoda UnionWith se používá pro přidání sady, jak je znázorněno v úryvku kódu uvedeném níže.

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

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

setA.UnionWith (setB);

foreach (řetězec str v setA)

{

Console.WriteLine (str);

}

Když spustíte výše uvedený kód, prvky setB se zkopírují do setA. SetA tedy nyní bude obsahovat „A“, „B“, „C“, „D“, „E“, „X“ a „Y“.

IntersectWith

Metoda IntersectWith se používá k reprezentaci průsečíku dvou HashSets. Zde je příklad, jak tomu porozumět.

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

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

setA.IntersectWith (setB);

foreach (řetězec str v setA)

{

Console.WriteLine (str);

}

Když spustíte výše uvedený program, v okně konzoly se zobrazí pouze prvky společné pro dvě sady HashSets. Výstup bude vypadat takto:

Kromě

Metoda ExceptWith představuje odčítání matematické množiny a je operací O (n). Předpokládejme, že máte dvě sady HashSet setA a setB a zadáte následující příkaz:

setA.ExceptWith (setB);

To by vrátilo prvky setA, které nejsou v setB. Pochopme to na dalším příkladu. Zvažte níže uvedený fragment kódu.

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

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

setA.ExceptWith (setB);

foreach (řetězec str v setA)

{

Console.WriteLine (str);

}

Když provedete výše uvedený program, prvky „B“, „D“ a „E“ se vytisknou v okně konzoly, jak je znázorněno na obrázku 5.

SymmetricExceptWith

Metoda SymmetricExceptWith se používá k úpravě HashSet tak, aby obsahovala pouze jedinečné prvky dvou HashSets, tj. Prvky, které nejsou společné pro obě HashSets. Zvažte následující fragment kódu, který to ilustruje.

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

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

setA.SymmetricExceptWith (setB);

foreach (řetězec str v setA)

{

Console.WriteLine (str);

}

Když spustíte výše uvedený kód, v okně konzoly se zobrazí pouze jedinečné prvky setA a setB - tj. Prvky, které jsou přítomny v setA, ale ne v setB, a prvky, které jsou přítomny v setB, ale ne v setA. jak je znázorněno na obrázku 6.

Zatímco průměrná složitost pro přístup k prvku v poli je O (n), kde n představuje počet prvků v poli, složitost je pouze O (1) pro přístup ke konkrétnímu prvku v HashSet. Díky tomu je HashSet dobrou volbou pro rychlé vyhledávání a pro provádění nastavených operací. Seznam můžete použít, pokud chcete uložit kolekci položek v určitém pořadí a možná také zahrnout duplikáty.

Jak udělat více v C #:

  • Jak používat pojmenované a volitelné parametry v C #
  • Jak srovnávat C # kód pomocí BenchmarkDotNet
  • Jak používat plynulá rozhraní a řetězení metod v C #
  • Jak testovat statické metody v C #
  • Jak refaktorovat Boží objekty v C #
  • Jak používat ValueTask v C #
  • Jak používat neměnnost v C.
  • Jak používat const, readonly a static v C #
  • Jak používat datové anotace v C #
  • Jak pracovat s identifikátory GUID v C # 8
  • Kdy použít abstraktní třídu vs. rozhraní v C #
  • Jak pracovat s AutoMapperem v C #
  • Jak používat výrazy lambda v C #
  • Jak pracovat s delegáty Action, Func a Predicate v C #
  • Jak pracovat s delegáty v C #
  • Jak implementovat jednoduchý záznamník v C #
  • Jak pracovat s atributy v C #
  • Jak pracovat s log4net v C #
  • Jak implementovat vzor návrhu úložiště v C #
  • Jak pracovat s odrazem v C #
  • Jak pracovat se souborovým systémem v C #
  • Jak provést línou inicializaci v C #
  • Jak pracovat s MSMQ v C #
  • Jak pracovat s metodami rozšíření v C #
  • Jak na nás lambda výrazy v C #
  • Kdy použít volatilní klíčové slovo v C #
  • Jak používat klíčové slovo výnos v C #
  • Jak implementovat polymorfismus v C #
  • Jak vytvořit svůj vlastní plánovač úloh v C #
  • Jak pracovat s RabbitMQ v C #
  • Jak pracovat s n-ticí v C #
  • Zkoumání virtuálních a abstraktních metod v C #
  • Jak používat Dapper ORM v C #
  • Jak používat návrhový vzor muší váhy v C #
$config[zx-auto] not found$config[zx-overlay] not found