Как да използвам HashSet в C #

HashSet е оптимизирана колекция от неподредени, уникални елементи, която осигурява бързо търсене и високоефективни зададени операции. Класът HashSet е представен за първи път в .NET 3.5 и е част от пространството от имена System.Collection.Generic. Тази статия говори за това как можем да работим с HashSets в C #.

За да работите с примерите за кодове, предоставени в тази статия, трябва да имате Visual Studio 2019 инсталиран във вашата система. Ако все още нямате копие, можете да изтеглите Visual Studio 2019 тук.

Създайте проект за приложение на конзола .NET Core в Visual Studio

Първо, нека създадем проект за приложение на .NET Core Console в Visual Studio. Ако приемем, че Visual Studio 2019 е инсталиран във вашата система, следвайте стъпките, описани по-долу, за да създадете нов проект за приложение на .NET Core Console в Visual Studio.

  1. Стартирайте Visual Studio IDE.
  2. Кликнете върху „Създаване на нов проект“.
  3. В прозореца „Създаване на нов проект“ изберете „Console App (.NET Core)“ от показания списък с шаблони.
  4. Щракнете върху Напред.
  5. В показания след това прозорец „Конфигуриране на вашия нов проект“ посочете името и местоположението на новия проект.
  6. Щракнете върху Създаване.

Това ще създаде нов проект за приложение на конзола .NET Core в Visual Studio 2019. Ще използваме този проект за работа с HashSet в следващите раздели на тази статия.

Какво е HashSet?

HashSet - представен от класа HashSet, отнасящ се до System.Collections.Generic пространство от имена - е високоефективна, неподредена колекция от уникални елементи. Следователно HashSet не е сортиран и не съдържа дублиращи се елементи. HashSet също не поддържа индекси - можете да използвате само изброители. HashSet обикновено се използва за високоефективни операции, включващи набор от уникални данни.

Класът HashSet реализира няколко интерфейса, както е показано по-долу:

публичен клас 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

Тъй като HashSet съдържа само уникални елементи, вътрешната му структура е оптимизирана за по-бързо търсене. Имайте предвид, че можете да съхранявате една нулева стойност в HashSet. Така че, HashSet е добър избор, когато искате колекция, която съдържа уникални елементи и елементите в колекцията могат да бъдат търсени бързо.

Търсене на елемент в HashSet в C #

За да търсите елемент в HashSet, можете да използвате метода Contains, както е показано в кодовия фрагмент, даден по-долу:

static void Main (низ [] аргументи)

        {

            HashSet hashSet = нов HashSet ();

            hashSet.Add ("A");

            hashSet.Add ("B");

            hashSet.Add ("C");

            hashSet.Add ("D");

            if (hashSet.Contens ("D"))

                Console.WriteLine („Необходимият елемент е достъпен.“);

            друго

                Console.WriteLine („Необходимият елемент не е налице.“);

            Console.ReadKey ();

        }

Елементите на HashSet винаги са уникални

Ако се опитате да вмъкнете дублиращ се елемент в HashSet, той просто ще бъде игнориран, но няма да се появи изключение по време на изпълнение. Следният кодов фрагмент илюстрира това.

static void Main (низ [] аргументи)

{

   HashSet hashSet = нов HashSet ();

   hashSet.Add ("A");

   hashSet.Add ("B");

   hashSet.Add ("C");

   hashSet.Add ("D");

   hashSet.Add ("D");

   Console.WriteLine ("Броят на елементите е: {0}", hashSet.Count);

   Console.ReadKey ();

}

Когато изпълнявате програмата, изходът ще бъде както е показано на фигура 1.

Сега разгледайте следния кодов фрагмент, който илюстрира как се елиминират дублиращи се елементи:

низ [] градове = нов низ [] {

                "Делхи",

                "Колката",

                "Ню Йорк",

                "Лондон",

                "Токио",

                "Вашингтон",

                "Токио"

            };

            HashSet hashSet = нов HashSet (градове);

            foreach (var град в hashSet)

            {

                Console.WriteLine (град);

            }

Когато изпълните горната програма, дублираните имена на градове ще бъдат премахнати.

Премахване на елементи от HashSet в C #

За да премахнете елемент от HashSet, трябва да извикате метода Remove. Синтаксисът на метода Remove е даден по-долу.

public bool Remove (T item);

Ако елементът бъде намерен в колекцията, методът Remove премахва елемент от HashSet и връща true при успех, false в противен случай.

Кодовият фрагмент, даден по-долу, илюстрира как можете да използвате метода Remove, за да премахнете елемент от HashSet.

низ елемент = "D";

if (hashSet.Contains (item))

{

   hashSet.Remove (елемент);

}

За да премахнете всички елементи от HashSet, можете да използвате метода Clear.

Използвайте методите за задаване на HashSet в C #

HashSet има редица важни методи за набор операции като IntersectWith, UnionWith, IsProperSubsetOf, ExceptWith и SymmetricExceptWith.

IsProperSubsetOf

Методът IsProperSubsetOf се използва, за да се определи дали екземпляр на HashSet е подходящо подмножество на колекция. Това е илюстрирано в кодовия фрагмент, даден по-долу.

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 съдържа всички елементи на setA.");

if (! setA.IsProperSubsetOf (setB))

   Console.WriteLine („setB не съдържа всички елементи на setA.“);

Когато изпълнявате горната програма, трябва да видите следния изход в прозореца на конзолата.

UnionWith

Методът UnionWith се използва за добавяне на набори, както е илюстрирано в кодовия фрагмент, даден по-долу.

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

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

setA.UnionWith (setB);

foreach (низ str в setA)

{

   Console.WriteLine (str);

}

Когато изпълнявате горния парче код, елементите на setB се копират в setA. Така че setA вече ще включва "A", "B", "C", "D", "E", "X" и "Y". 

IntersectWith 

Методът IntersectWith се използва за представяне на пресичането на два HashSets. Ето пример за разбиране на това.

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

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

setA.IntersectWith (setB);

foreach (низ str в setA)

{

    Console.WriteLine (str);

}

Когато стартирате горната програма, в прозореца на конзолата ще се покажат само елементите, общи за двата HashSets. Резултатът ще изглежда така: 

ОсвенWith

Методът ExceptWith представлява математическо изваждане на множество и е операция O (n). Да предположим, че имате два HashSets setA и setB и вие посочвате следния израз:

setA.ExceptWith (setB);

Това би върнало елементите на setA, които не присъстват в setB. Нека разберем това с друг пример. Помислете за кодовия фрагмент, даден по-долу.

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

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

setA.ExceptWith (setB);

foreach (низ str в setA)

{

   Console.WriteLine (str);

}

Когато изпълните горната програма, елементите "B", "D" и "E" ще бъдат отпечатани в прозореца на конзолата, както е показано на фигура 5.

SymmetricExceptWith 

Методът SymmetricExceptWith се използва за модифициране на HashSet, за да съдържа само уникалните елементи на два HashSets, т.е. елементите, които не са общи за двата HashSets. Помислете за следния кодов фрагмент, който илюстрира това.

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

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

setA.SymmetricExceptWith (setB);

foreach (низ str в setA)

{

  Console.WriteLine (str);

}

Когато изпълнявате горния код, само уникалните елементи на setA и setB - т.е. елементите, които присъстват в setA, но не и в setB, и елементите, които присъстват в setB, но не и в setA - ще се показват в прозореца на конзолата както е показано на фигура 6.

Докато средната сложност за достъп до елемент в масив е O (n), където n представлява броя на елементите в масива, сложността е просто O (1) за достъп до определен елемент в HashSet. Това прави HashSet добър избор за бързо търсене и за извършване на зададени операции. Можете да използвате Списък, ако искате да съхранявате колекция от елементи в определен ред и може да включите и дубликати. 

Как да направите повече в C #:

  • Как да използваме имена и незадължителни параметри в C #
  • Как да сравняваме C # кода с помощта на BenchmarkDotNet
  • Как да използвам плавни интерфейси и вериги на методи в C #
  • Как да тествате статични методи в C #
  • Как да рефакторирам Бог обекти в C #
  • Как да използвам ValueTask в C #
  • Как да използваме неизменност в C
  • Как да използвам const, readonly и static в C #
  • Как да използвам анотации на данни в C #
  • Как да работите с GUID в C # 8
  • Кога да се използва абстрактен клас срещу интерфейс в C #
  • Как да работя с AutoMapper в C #
  • Как да използвам ламбда изрази в C #
  • Как да работя с Action, Func и Predicate делегати в C #
  • Как да работя с делегати в C #
  • Как да внедрите прост регистратор в C #
  • Как да работя с атрибути в C #
  • Как да работя с log4net в C #
  • Как да приложим шаблона за проектиране на хранилището в C #
  • Как да работя с отражение в C #
  • Как да работя с файлова система за наблюдение в C #
  • Как да извършите мързелива инициализация в C #
  • Как да работите с MSMQ в C #
  • Как да работя с методи за разширение в C #
  • Как да използваме ламбда изрази в C #
  • Кога да се използва летливата ключова дума в C #
  • Как да използвам ключовата дума yield в C #
  • Как да приложим полиморфизъм в C #
  • Как да изградите свой собствен планировчик на задачи в C #
  • Как да работя с RabbitMQ в C #
  • Как да работите с кортеж в C #
  • Проучване на виртуални и абстрактни методи в C #
  • Как да използваме Dapper ORM в C #
  • Как да използвам шаблона за дизайн на мухата в C #