Apakah ada koleksi di C # yang tidak memungkinkan Anda menambahkan item duplikat ke dalamnya? Misalnya, dengan kelas konyol
public class Customer {
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public override int GetHashCode() {
return (FirstName + LastName + Address).GetHashCode();
}
public override bool Equals(object obj) {
Customer C = obj as Customer;
return C != null && String.Equals(this.FirstName, C.FirstName) && String.Equals(this.LastName, C.LastName) && String.Equals(this.Address, C.Address);
}
}
Kode berikut (jelas) akan memunculkan pengecualian:
Customer Adam = new Customer { Address = "A", FirstName = "Adam", LastName = "" };
Customer AdamDup = new Customer { Address = "A", FirstName = "Adam", LastName = "" };
Dictionary<Customer, bool> CustomerHash = new Dictionary<Customer, bool>();
CustomerHash.Add(Adam, true);
CustomerHash.Add(AdamDup, true);
Tetapi apakah ada kelas yang juga akan menjamin keunikan, tetapi tanpa KeyValuePairs? Saya pikir HashSet<T>
akan melakukan itu, tetapi setelah membaca dokumen tampaknya kelas itu hanya implementasi set ( go figure ).
HashSet<T>
. MSDN mengatakan "Kelas HashSet <T> menyediakan operasi set berkinerja tinggi. Satu set adalah kumpulan yang tidak berisi elemen duplikat, dan elemennya tidak dalam urutan tertentu."HashSet<T>
tidak cukup?Dictionary<K,V>
Kelas tidak menjamin segala jenis urutan.HashSet<T>.Add
metode dan lempar ketikafalse
...Jawaban:
HashSet<T>
adalah apa yang Anda cari. Dari MSDN (penekanan ditambahkan):Perhatikan bahwa
HashSet<T>.Add(T item)
metode mengembalikan abool
-true
jika item ditambahkan ke koleksi;false
jika item tersebut sudah ada.sumber
IEquatable
, Anda bisa meneruskan implementasi (kustom) dariEqualityComparer<T>
instance keHashSet<T>
konstruktor.Bagaimana dengan metode ekstensi di HashSet?
sumber
Dari
HashSet<T>
halaman di MSDN:(penekanan saya)
sumber
Jika yang Anda butuhkan hanyalah memastikan keunikan elemen, maka HashSet adalah yang Anda butuhkan.
Apa yang Anda maksud ketika Anda mengatakan "hanya implementasi set"? Satu set adalah (menurut definisi) kumpulan elemen unik yang tidak menyimpan urutan elemen.
sumber
Anda dapat mencoba
HashSet<T>
sumber
Hanya untuk menambahkan 2 sen saya ...
jika Anda membutuhkan ValueExistingException-throwing,
HashSet<T>
Anda juga dapat membuat koleksi Anda dengan mudah:ini dapat berguna misalnya jika Anda membutuhkannya di banyak tempat ...
sumber
Anda dapat melihat semacam Daftar Unik sebagai berikut
dan Anda bisa menggunakannya seperti berikut
hanya akan
"abc","def","ghi","jkl","mno"
selalu kembali meskipun duplikat ditambahkan ke dalamnyasumber