Cara menggunakan HashSet di C #

HashSet adalah koleksi elemen unik yang tidak tersusun yang dioptimumkan yang memberikan carian pantas dan operasi set berprestasi tinggi. Kelas HashSet pertama kali diperkenalkan di .NET 3.5 dan merupakan sebahagian daripada ruang nama System.Collection.Generic. Artikel ini membincangkan bagaimana kita dapat bekerja dengan HashSets di C #.

Untuk bekerja dengan contoh kod yang disediakan dalam artikel ini, anda harus memasang Visual Studio 2019 di sistem anda. Sekiranya anda belum mempunyai salinannya, anda boleh memuat turun Visual Studio 2019 di sini.

Buat projek aplikasi konsol .NET Core di Visual Studio

Pertama, mari buat projek Aplikasi Konsol Teras .NET di Visual Studio. Dengan mengandaikan Visual Studio 2019 dipasang di sistem anda, ikuti langkah-langkah yang digariskan di bawah untuk membuat projek Aplikasi Konsol Teras NET baru di Visual Studio.

  1. Lancarkan ID Studio Visual.
  2. Klik pada "Buat projek baru."
  3. Di tetingkap "Buat projek baru", pilih "Aplikasi Konsol (.NET Core)" dari senarai templat yang dipaparkan.
  4. Klik Seterusnya.
  5. Di tetingkap "Konfigurasikan projek baru anda" yang ditunjukkan di sebelah, tentukan nama dan lokasi untuk projek baru.
  6. Klik Buat.

Ini akan membuat projek aplikasi konsol .NET Core baru di Visual Studio 2019. Kami akan menggunakan projek ini untuk bekerjasama dengan HashSet di bahagian seterusnya artikel ini.

Apa itu HashSet?

HashSet - diwakili oleh kelas HashSet yang berkaitan dengan System.Collections.Games namespace - adalah koleksi elemen unik yang berprestasi tinggi. Oleh itu HashSet tidak disusun dan tidak mengandungi unsur pendua. HashSet juga tidak menyokong indeks - anda boleh menggunakan penghitung sahaja. HashSet biasanya digunakan untuk operasi berprestasi tinggi yang melibatkan sekumpulan data unik.

Kelas HashSet menerapkan beberapa antara muka seperti yang ditunjukkan di bawah:

kelas awam HashSet: System.Collections.Generic.ICollection,

Sistem. Koleksi. Generik. Tidak terkira,

System.Collections.Generic.IReadOnlyCollection,

System.Collections.Generic.ISet,

System.Runtime.Serialization.IDeserializationCallback,

Sistem.Runtime.Serialization.ISerializable

Oleh kerana HashSet hanya mengandungi elemen unik, struktur dalamannya dioptimumkan untuk carian yang lebih pantas. Perhatikan bahawa anda boleh menyimpan satu nilai kosong dalam HashSet. Jadi, HashSet adalah pilihan yang baik apabila anda mahukan koleksi yang mengandungi elemen unik dan elemen dalam koleksi dapat dicari dengan cepat.

Cari item dalam HashSet di C #

Untuk mencari item dalam HashSet, anda boleh menggunakan kaedah Mengandung seperti yang ditunjukkan dalam coretan kod yang diberikan di bawah:

kekosongan statik Utama (string [] args)

        {

            HashSet hashSet = HashSet baru ();

            hashSet.Add ("A");

            hashSet.Add ("B");

            hashSet.Add ("C");

            hashSet.Add ("D");

            jika (hashSet.Contains ("D"))

                Console.WriteLine ("Elemen yang diperlukan tersedia.");

            yang lain

                Console.WriteLine ("Elemen yang diperlukan tidak tersedia.");

            Konsol.ReadKey ();

        }

Elemen HashSet selalu unik

Sekiranya anda cuba memasukkan unsur pendua dalam HashSet, ia akan diabaikan tetapi tidak ada pengecualian waktu operasi. Coretan kod berikut menggambarkan perkara ini.

kekosongan statik Utama (string [] args)

{

   HashSet hashSet = HashSet baru ();

   hashSet.Add ("A");

   hashSet.Add ("B");

   hashSet.Add ("C");

   hashSet.Add ("D");

   hashSet.Add ("D");

   Console.WriteLine ("Bilangan elemen adalah: {0}", hashSet.Count);

   Konsol.ReadKey ();

}

Ketika anda menjalankan program, output akan seperti yang ditunjukkan pada Gambar 1.

Sekarang pertimbangkan coretan kod berikut yang menggambarkan bagaimana unsur pendua dihapuskan:

rentetan [] bandar = rentetan baru [] {

                "Delhi",

                "Kolkata",

                "New York",

                "London",

                "Tokyo",

                "Washington",

                "Tokyo"

            };

            HashSet hashSet = HashSet baru (bandar);

            foreach (bandar var di hashSet)

            {

                Console.WriteLine (bandar);

            }

Apabila anda menjalankan program di atas, nama bandar pendua akan dikeluarkan.

Keluarkan elemen dari HashSet di C #

Untuk membuang item dari HashSet, anda harus memanggil kaedah Remove. Sintaks kaedah Buang diberikan di bawah.

bool awam Buang (item T);

Sekiranya item tersebut dijumpai dalam koleksi, kaedah Remove akan membuang elemen dari HashSet dan mengembalikan true on success, false sebaliknya.

Coretan kod yang diberikan di bawah menggambarkan bagaimana anda boleh menggunakan kaedah Remove untuk membuang item dari HashSet.

item tali = "D";

jika (hashSet.Contains (item))

{

   hashSet.Remove (item);

}

Untuk mengeluarkan semua item dari HashSet, anda boleh menggunakan kaedah Clear.

Gunakan kaedah operasi set HashSet di C #

HashSet mempunyai sebilangan kaedah penting untuk operasi set seperti IntersectWith, UnionWith, IsProperSubsetOf, ExceptWith, dan SymmetricExceptWith.

IsProperSubsetOf

Kaedah IsProperSubsetOf digunakan untuk menentukan sama ada instance HashSet adalah subset koleksi yang betul. Ini digambarkan dalam coretan kod yang diberikan di bawah.

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

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

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

jika (setA.IsProperSubsetOf (setC))

   Console.WriteLine ("setC mengandungi semua elemen setA.");

jika (! setA.IsProperSubsetOf (setB))

   Console.WriteLine ("setB tidak mengandungi semua elemen setA.");

Semasa anda menjalankan program di atas, anda akan melihat output berikut di tetingkap konsol.

UnionWith

Kaedah UnionWith digunakan untuk penambahan set seperti yang digambarkan dalam coretan kod yang diberikan di bawah.

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

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

setA.UnionWith (setB);

foreach (tali string dalam setA)

{

   Console.WriteLine (str);

}

Apabila anda melaksanakan sekeping kod di atas, elemen setB disalin ke setA. Jadi setA sekarang akan merangkumi "A", "B", "C", "D", "E", "X", dan "Y". 

Bersilang Dengan 

Kaedah IntersectWith digunakan untuk mewakili persilangan dua HashSet. Inilah contoh untuk memahami perkara ini.

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

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

setA.IntersectWith (setB);

foreach (tali string dalam setA)

{

    Console.WriteLine (str);

}

Semasa anda menjalankan program di atas, hanya elemen yang sama dengan dua HashSet yang akan dipaparkan di tetingkap konsol. Keluarannya akan seperti ini: 

Kecuali Dengan

Kaedah ExceptWith mewakili pengurangan set matematik dan merupakan operasi O (n). Andaikan anda mempunyai dua set HashA dan setB dan anda menyatakan pernyataan berikut:

setA.ExceptWith (setB);

Ini akan mengembalikan elemen setA yang tidak terdapat dalam setB. Mari kita fahami ini dengan contoh lain. Pertimbangkan coretan kod yang diberikan di bawah.

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

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

setA.ExceptWith (setB);

foreach (tali string dalam setA)

{

   Console.WriteLine (str);

}

Semasa anda menjalankan program di atas, elemen "B", "D", dan "E" akan dicetak di tetingkap konsol seperti yang ditunjukkan pada Gambar 5.

SymmetricExceptWith 

Kaedah SymmetricExceptWith digunakan untuk mengubahsuai HashSet agar hanya mengandungi elemen unik dari dua HashSet, iaitu elemen yang tidak biasa bagi kedua-dua HashSet. Pertimbangkan coretan kod berikut yang menggambarkan ini.

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

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

setA.SymmetricExceptWith (setB);

foreach (tali string dalam setA)

{

  Console.WriteLine (str);

}

Apabila anda melaksanakan kod di atas, hanya elemen unik setA dan setB - iaitu elemen yang ada di setA tetapi tidak di setB, dan elemen yang ada di setB tetapi tidak di setA - akan dipaparkan di tetingkap konsol seperti yang ditunjukkan dalam Rajah 6.

Walaupun kerumitan rata-rata untuk mengakses elemen dalam array adalah O (n), di mana n mewakili jumlah elemen dalam array, kerumitannya hanya O (1) untuk mengakses elemen tertentu dalam HashSet. Ini menjadikan HashSet pilihan yang baik untuk carian pantas dan untuk melakukan operasi set. Anda boleh menggunakan Senarai jika anda ingin menyimpan koleksi barang dalam urutan tertentu, dan mungkin juga menyertakan pendua. 

Cara melakukan lebih banyak perkara di C #:

  • Cara menggunakan parameter bernama dan pilihan dalam C #
  • Cara penanda aras kod C # menggunakan BenchmarkDotNet
  • Cara menggunakan antara muka dan kaedah rantai lancar dalam C #
  • Cara menguji kaedah statik unit di C #
  • Cara refactor objek Tuhan di C #
  • Cara menggunakan ValueTask dalam C #
  • Cara menggunakan kebolehubahan dalam C
  • Cara menggunakan const, hanya baca, dan statik di C #
  • Cara menggunakan anotasi data di C #
  • Cara bekerja dengan GUID di C # 8
  • Bilakah menggunakan kelas abstrak vs antara muka dalam C #
  • Cara bekerja dengan AutoMapper di C #
  • Cara menggunakan ungkapan lambda dalam C #
  • Cara bekerjasama dengan delegasi Action, Func, dan Predicate di C #
  • Cara bekerja dengan perwakilan di C #
  • Cara melaksanakan pembalak sederhana di C #
  • Cara bekerja dengan atribut di C #
  • Cara bekerja dengan log4net di C #
  • Cara melaksanakan corak reka bentuk repositori di C #
  • Cara bekerja dengan refleksi di C #
  • Cara bekerja dengan pemantau sistem fail di C #
  • Cara melakukan inisial malas di C #
  • Cara bekerja dengan MSMQ di C #
  • Cara bekerja dengan kaedah peluasan di C #
  • Bagaimana untuk kami ungkapan lambda dalam C #
  • Bilakah menggunakan kata kunci tidak stabil dalam C #
  • Cara menggunakan kata kunci hasil dalam C #
  • Cara melaksanakan polimorfisme dalam C #
  • Bagaimana membina penjadual tugas anda sendiri di C #
  • Cara bekerja dengan RabbitMQ di C #
  • Cara bekerja dengan tuple di C #
  • Meneroka kaedah maya dan abstrak dalam C #
  • Cara menggunakan Dapper ORM di C #
  • Cara menggunakan corak reka bentuk flyweight di C #