Cara menggunakan HashSet di C #

HashSet adalah kumpulan elemen unik tak berurutan yang dioptimalkan yang menyediakan pencarian cepat dan operasi set berkinerja tinggi. Kelas HashSet pertama kali diperkenalkan di .NET 3.5 dan merupakan bagian dari namespace System.Collection.Generic. Artikel ini berbicara tentang bagaimana kita dapat bekerja dengan HashSets di C #.

Untuk bekerja dengan contoh kode yang disediakan dalam artikel ini, Anda harus menginstal Visual Studio 2019 di sistem Anda. Jika Anda belum memiliki salinannya, Anda dapat mengunduh Visual Studio 2019 di sini.

Buat proyek aplikasi konsol inti .NET di Visual Studio .NET

Pertama, mari buat proyek Aplikasi Konsol Inti .NET di Visual Studio. Dengan asumsi Visual Studio 2019 diinstal di sistem Anda, ikuti langkah-langkah yang diuraikan di bawah ini untuk membuat proyek aplikasi konsol inti .NET baru di Visual Studio.

  1. Luncurkan Visual Studio IDE.
  2. Klik "Buat proyek baru".
  3. Di jendela "Buat proyek baru", pilih "Aplikasi Konsol (.NET Core)" dari daftar template yang ditampilkan.
  4. Klik Next.
  5. Di jendela "Configure your new project" yang ditampilkan berikutnya, tentukan nama dan lokasi untuk proyek baru tersebut.
  6. Klik Buat.

Ini akan membuat proyek aplikasi konsol .NET Core baru di Visual Studio 2019. Kami akan menggunakan proyek ini untuk bekerja dengan HashSet di bagian selanjutnya dari artikel ini.

Apa itu HashSet?

HashSet - diwakili oleh kelas HashSet yang berkaitan dengan System.Collections.Generic namespace - adalah kumpulan elemen unik berkinerja tinggi dan tidak berurutan. Karenanya, HashSet tidak disortir dan tidak mengandung elemen duplikat. HashSet juga tidak mendukung indeks - Anda hanya dapat menggunakan enumerator. HashSet biasanya digunakan untuk operasi berkinerja tinggi yang melibatkan sekumpulan data unik.

Kelas HashSet mengimplementasikan beberapa antarmuka seperti yang ditunjukkan di bawah ini:

kelas publik 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

Karena HashSet hanya berisi elemen unik, struktur internalnya dioptimalkan untuk pencarian yang lebih cepat. Perhatikan bahwa Anda dapat menyimpan satu nilai null di HashSet. Jadi, HashSet adalah pilihan yang tepat bila Anda menginginkan koleksi yang mengandung unsur-unsur unik dan unsur-unsur dalam koleksinya bisa dicari dengan cepat.

Cari item di HashSet di C #

Untuk mencari item di HashSet Anda dapat menggunakan metode Berisi seperti yang ditunjukkan pada potongan kode yang diberikan di bawah ini:

static void Main (string [] args)

        {

            HashSet hashSet = HashSet baru ();

            hashSet.Add ("A");

            hashSet.Add ("B");

            hashSet.Add ("C");

            hashSet.Add ("D");

            if (hashSet.Contains ("D"))

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

            lain

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

            Console.ReadKey ();

        }

Elemen HashSet selalu unik

Jika Anda mencoba memasukkan elemen duplikat dalam HashSet, itu akan diabaikan begitu saja tetapi tidak ada pengecualian runtime yang akan dilemparkan. Cuplikan kode berikut menggambarkan hal ini.

static void Main (string [] args)

{

   HashSet hashSet = HashSet baru ();

   hashSet.Add ("A");

   hashSet.Add ("B");

   hashSet.Add ("C");

   hashSet.Add ("D");

   hashSet.Add ("D");

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

   Console.ReadKey ();

}

Saat Anda menjalankan program, hasilnya akan seperti yang ditunjukkan pada Gambar 1.

Sekarang perhatikan cuplikan kode berikut yang menggambarkan bagaimana elemen duplikat dihilangkan:

string [] kota = string baru [] {

                "Delhi",

                "Kolkata",

                "New York",

                "London",

                "Tokyo",

                "Washington",

                "Tokyo"

            };

            HashSet hashSet = HashSet baru (kota);

            foreach (var city in hashSet)

            {

                Console.WriteLine (kota);

            }

Saat Anda menjalankan program di atas, nama kota duplikat akan dihapus.

Hapus elemen dari HashSet di C #

Untuk menghapus item dari HashSet Anda harus memanggil metode Hapus. Sintaks dari metode Hapus diberikan di bawah ini.

public bool Hapus (T item);

Jika item ditemukan dalam koleksi, metode Hapus menghapus elemen dari HashSet dan mengembalikan nilai true pada kesuksesan, false jika tidak.

Potongan kode yang diberikan di bawah ini menggambarkan bagaimana Anda dapat menggunakan metode Hapus untuk menghapus item dari HashSet.

item string = "D";

if (hashSet.Contains (item))

{

   hashSet.Remove (item);

}

Untuk menghapus semua item dari HashSet Anda dapat menggunakan metode Hapus.

Gunakan metode operasi set HashSet di C #

HashSet memiliki sejumlah metode penting untuk operasi set seperti IntersectWith, UnionWith, IsProperSubsetOf, KecualiWith, dan SymmetricExceptWith.

IsProperSubsetOf

Metode IsProperSubsetOf digunakan untuk menentukan apakah instance HashSet adalah subset yang tepat dari sebuah koleksi. Ini diilustrasikan dalam potongan kode yang diberikan di bawah ini.

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"};

if (setA.IsProperSubsetOf (setC))

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

if (! setA.IsProperSubsetOf (setB))

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

Saat Anda menjalankan program di atas, Anda akan melihat output berikut di jendela konsol.

UnionWith

Metode UnionWith digunakan untuk penambahan set seperti yang diilustrasikan dalam potongan kode yang diberikan di bawah ini.

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

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

setA.UnionWith (setB);

foreach (string str di setA)

{

   Console.WriteLine (str);

}

Saat Anda menjalankan bagian kode di atas, elemen setB disalin ke dalam setA. Jadi setA sekarang akan menyertakan "A", "B", "C", "D", "E", "X", dan "Y". 

IntersectWith 

Metode IntersectWith digunakan untuk merepresentasikan perpotongan dua HashSet. Berikut adalah contoh untuk memahami ini.

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

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

setA.IntersectWith (setB);

foreach (string str di setA)

{

    Console.WriteLine (str);

}

Saat Anda menjalankan program di atas, hanya elemen yang umum untuk dua HashSet yang akan ditampilkan di jendela konsol. Outputnya akan terlihat seperti ini: 

Kecuali dengan

Metode ExceptionWith merepresentasikan pengurangan himpunan matematika dan merupakan operasi O (n). Asumsikan Anda memiliki dua HashSets setA dan setB dan Anda menentukan pernyataan berikut:

setA.ExceptWith (setB);

Ini akan mengembalikan elemen setA yang tidak ada di setB. Mari kita pahami ini dengan contoh lain. Pertimbangkan potongan kode yang diberikan di bawah ini.

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

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

setA.ExceptWith (setB);

foreach (string str di setA)

{

   Console.WriteLine (str);

}

Saat Anda menjalankan program di atas, elemen "B", "D", dan "E" akan dicetak pada jendela konsol seperti yang ditunjukkan pada Gambar 5.

SymmetricExceptWith 

Metode SymmetricExceptWith digunakan untuk memodifikasi HashSet agar hanya berisi elemen unik dari dua HashSet, yaitu elemen yang tidak umum untuk kedua HashSet. Perhatikan cuplikan kode berikut yang menggambarkan hal ini.

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

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

setA.SymmetricExceptWith (setB);

foreach (string str di setA)

{

  Console.WriteLine (str);

}

Saat Anda menjalankan kode di atas, hanya elemen unik dari setA dan setB - yaitu, elemen yang ada di setA tetapi tidak di setB, dan elemen yang ada di setB tetapi tidak di setA - akan ditampilkan di jendela konsol seperti yang ditunjukkan pada Gambar 6.

Kompleksitas rata-rata untuk mengakses elemen dalam array adalah O (n), di mana n mewakili jumlah elemen dalam array, kompleksitasnya hanya O (1) untuk mengakses elemen tertentu dalam HashSet. Ini menjadikan HashSet pilihan yang baik untuk pencarian cepat dan untuk melakukan operasi yang ditetapkan. Anda dapat menggunakan Daftar jika Anda ingin menyimpan koleksi item dalam urutan tertentu, dan mungkin menyertakan duplikat juga. 

Bagaimana melakukan lebih banyak di C #:

  • Cara menggunakan parameter bernama dan opsional di C #
  • Cara benchmark kode C # menggunakan BenchmarkDotNet
  • Cara menggunakan antarmuka yang lancar dan rangkaian metode di C #
  • Cara menguji unit metode statis di C #
  • Cara refactor objek Tuhan di C #
  • Cara menggunakan ValueTask di C #
  • Cara menggunakan kekekalan di C
  • Cara menggunakan const, readonly, dan static di C #
  • Cara menggunakan anotasi data di C #
  • Cara bekerja dengan GUID di C # 8
  • Kapan menggunakan kelas abstrak vs. antarmuka di C #
  • Bagaimana bekerja dengan AutoMapper di C #
  • Cara menggunakan ekspresi lambda di C #
  • Cara bekerja dengan delegasi Action, Func, dan Predicate di C #
  • Bagaimana bekerja dengan delegasi di C #
  • Bagaimana menerapkan logger sederhana di C #
  • Bagaimana bekerja dengan atribut di C #
  • Bagaimana bekerja dengan log4net di C #
  • Bagaimana menerapkan pola desain repositori di C #
  • Bagaimana bekerja dengan refleksi di C #
  • Bagaimana bekerja dengan filesystemwatcher di C #
  • Bagaimana melakukan inisialisasi malas di C #
  • Bagaimana bekerja dengan MSMQ di C #
  • Bagaimana bekerja dengan metode ekstensi di C #
  • Bagaimana kami ekspresi lambda di C #
  • Kapan menggunakan kata kunci volatile di C #
  • Cara menggunakan kata kunci hasil di C #
  • Bagaimana menerapkan polimorfisme di C #
  • Cara membuat penjadwal tugas Anda sendiri di C #
  • Bagaimana bekerja dengan RabbitMQ di C #
  • Bagaimana bekerja dengan tupel di C #
  • Menjelajahi metode virtual dan abstrak di C #
  • Cara menggunakan Dapper ORM di C #
  • Cara menggunakan pola desain kelas terbang di C #