允许.NET中唯一项目的集合?

在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); } } 

下面的代码将(显然)抛出一个exception:

 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>是你正在寻找的。 来自MSDN (强调添加):

HashSet<T>类提供了高性能的集合操作。 集合是不包含重复元素的集合,其元素没有特定的顺序。

请注意,如果项目被添加到集合中, HashSet<T>.Add(T item)方法将返回一个booltrue ; 如果该项目已经存在,则为false

那么在HashSet的扩展方法呢?

 public static void AddOrThrow<T>(this HashSet<T> hash, T item) { if (!hash.Add(item)) throw new ValueExistingException(); } 

从MSDN上的HashSet<T>页面:

HashSet(Of T)类提供了高性能的集合操作。 集合是不包含重复元素的集合,其元素没有特定的顺序。

(重点是我的)

你可以试试HashSet<T>

如果您只需要确保元素的唯一性,那么HashSet就是您所需要的。

当你说“只是一套实施”时,你是什么意思? 一个集合(根据定义)是不保存元素顺序的唯一元素的集合。

只要加我2分钱…

如果你需要一个ValueExistingException – 抛出HashSet<T>你也可以很容易地创build你的集合:

 public class ThrowingHashSet<T> : ICollection<T> { private HashSet<T> innerHash = new HashSet<T>(); public void Add(T item) { if (!innerHash.Add(item)) throw new ValueExistingException(); } public void Clear() { innerHash.Clear(); } public bool Contains(T item) { return innerHash.Contains(item); } public void CopyTo(T[] array, int arrayIndex) { innerHash.CopyTo(array, arrayIndex); } public int Count { get { return innerHash.Count; } } public bool IsReadOnly { get { return false; } } public bool Remove(T item) { return innerHash.Remove(item); } public IEnumerator<T> GetEnumerator() { return innerHash.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); } } 

这可以是有用的,例如,如果你在很多地方需要它…