【发布时间】:2011-07-06 16:18:42
【问题描述】:
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> 会这样做,但在阅读了文档后,似乎该类只是一个集合实现(go figure)。
【问题讨论】:
-
我不明白您对
HashSet<T>的问题。 MSDN 说“HashSet类提供了高性能的集合操作。集合是不包含重复元素的集合,其元素没有特定的顺序。” -
你能解释一下为什么
HashSet<T>不够吗? -
@mootinator:
Dictionary<K,V>类不保证任何顺序。 -
我猜他只是想在您尝试添加现有值时抛出异常...为此,只需检查从
HashSet<T>.Add方法返回的布尔值并在false时抛出。 .. -
强烈建议只重载那些 immutable 类型。使用默认的 Reference-equality 时,可变客户通常会更好。