重複するアイテムを追加できないC#のコレクションはありますか?たとえば、愚かなクラスの
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);
}
}
次のコードは(明らかに)例外をスローします。
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);
しかし、同様に一意性を保証するクラスがありますが、KeyValuePairsはありませんか?私HashSet<T>
はそうするだろうと思っていましたが、ドキュメントを読んだら、クラスは単なるセット実装のようです(図を参照)。
HashSet<T>
不十分なのか、もう少し説明してもらえますか?
Dictionary<K,V>
クラスはいかなる種類の順序も保証しません。
HashSet<T>.Add
メソッドから返されたブール値を確認して、次の場合にスローしfalse
ます...
HashSet<T>
。MSDNによると、「HashSet <T>クラスは、高性能のセット操作を提供します。セットは、重複する要素を含まないコレクションであり、その要素には特定の順序はありません。」