允许.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)
方法将返回一个bool
– true
; 如果该项目已经存在,则为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(); } }
这可以是有用的,例如,如果你在很多地方需要它…