Data pendaftaran peserta sering memuat duplikat: satu kota dikirim dua kali karena admin salah klik, atau satu orang mengisi formulir dua kali. Menyimpan data semacam itu ke dalam List berarti kerja manual — memeriksa satu per satu sebelum menambah. HashSet menangani persoalan keunikan ini dari dalam: elemen duplikat tidak pernah tersimpan dua kali.
Elemen Unik secara Otomatis #
HashSet<T> menyimpan setiap nilai hanya satu kali. Method Add mengembalikan bool: true berarti nilai baru berhasil masuk, false berarti nilai tersebut sudah ada sehingga penambahan diabaikan. Di balik layar, runtime menghitung hash dari setiap nilai untuk menentukan posisi penyimpanan, dan hitungan itulah yang membuat pengecekan duplikat berlangsung cepat.
HashSet<string> kotaPeserta = new HashSet<string>();
bool tambahBandung1 = kotaPeserta.Add("Bandung");
bool tambahSurabaya = kotaPeserta.Add("Surabaya");
bool tambahBandung2 = kotaPeserta.Add("Bandung");
Console.WriteLine($"Tambah Bandung pertama: {tambahBandung1}");
Console.WriteLine($"Tambah Surabaya: {tambahSurabaya}");
Console.WriteLine($"Tambah Bandung kedua (duplikat): {tambahBandung2}");
Console.WriteLine($"Jumlah kota unik: {kotaPeserta.Count}");
List<string> pendaftaranHariIni = new List<string> { "Medan", "Bandung", "Medan" };
foreach (string kota in pendaftaranHariIni)
{
kotaPeserta.Add(kota);
}
Console.WriteLine($"Cek Semarang: {kotaPeserta.Contains("Semarang")}");
Console.WriteLine($"Cek Medan: {kotaPeserta.Contains("Medan")}");
foreach (string kota in kotaPeserta)
{
Console.WriteLine($"- {kota}");
}Output yang Dihasilkan:
Tambah Bandung pertama: True
Tambah Surabaya: True
Tambah Bandung kedua (duplikat): False
Jumlah kota unik: 2
Cek Semarang: False
Cek Medan: True
- Bandung
- Surabaya
- MedanMari kita telaah bagian penting contoh di atas:
- Baris 3-5 (
kotaPeserta.Add(...)): Pemanggilan pertama"Bandung"mengembalikanTrue; pemanggilan kedua dengan nilai yang sama mengembalikanFalsedan isi HashSet tetap bertahan. - Baris 7-10: Properti
Countmelaporkan 2, bukan 3, karena duplikat tidak ikut dihitung. - Baris 12-17: Loop menyalin isi
Listyang memuat duplikat;Addmenyaring"Medan"dan"Bandung"yang sudah ada sehingga hanya nilai baru yang masuk. - Baris 19-20:
Containsmemeriksa keanggotaan satu nilai; hasilnyaFalseuntuk"Semarang"danTrueuntuk"Medan".
Kapan Memilih HashSet #
HashSet cocok ketika keunikan dan kecepatan pencarian lebih penting daripada urutan. Pencarian Contains pada HashSet berjalan tanpa memindai elemen satu per satu, sedangkan Contains pada List memeriksa elemen dari depan ke belakang. Detail perbedaan performa ini dibahas pada bab Kompleksitas Operasi Koleksi.
Selain Add dan Contains, HashSet menyediakan operasi himpunan: UnionWith menggabungkan isi koleksi lain, IntersectWith menyisakan yang ada di kedua koleksi, dan ExceptWith menghapus elemen yang ada di koleksi lain. Nama-nama tersebut berasal dari matematika himpunan, dan masing-masing mengubah isi HashSet saat ini.