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>
会这么做,但看过文档后发现,这个类似乎只是一个集合实现(请看图)。
发布于 2012-07-04 04:14:37
public static void AddOrThrow<T>(this HashSet<T> hash, T item)
{
if (!hash.Add(item))
throw new ValueExistingException();
}
发布于 2011-03-02 01:13:55
如果您所需要的只是确保元素的唯一性,那么HashSet就是您所需要的。
你说“只是一个集合的实现”是什么意思?集合(根据定义)是不保存元素顺序的唯一元素的集合。
发布于 2011-03-02 03:03:55
我只想补充我的两分钱。
如果您需要抛出ValueExistingException的HashSet<T>
,您还可以轻松地创建您的集合:
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();
}
}
这可能是有用的,例如,如果您在许多地方需要它...
https://stackoverflow.com/questions/5157787
复制相似问题