在MSDN上读取HashSet,它用HashSet<T>
表示,如果T实现IEquatable<T>
,则HashSet将此用于IEqualityComparer<T>.Default
。
所以,让类Person:
public class Person : IEquality<Person>
{
private string pName;
public Person(string name){ pName=name; }
public string Name
{
get { return pName; }
set
{
if (pName.Equals(value, StringComparison.InvariantCultureIgnoreCase))
{
return;
}
pName = value;
}
}
public bool Equals(Person other)
{
if(other==null){return false;}
return pName.Equals(other.pName, StringComparison.InvariantCultureIgnoreCase);
}
public override bool Equals(object obj)
{
Person other = obj as Person;
if(other==null){return false;}
return Equals(other);
}
public override int GetHashCode(){return pName.GetHashCode();}
public override string ToString(){return pName;}
}
所以,让我们在另一个类或主函数中定义:
HashSet<Person> set = new HashSet<Person>();
set.Add(new Person("Smith"); // return true
Person p = new Person("Smi");
set.Add(p); // return true
p.Name = "Smith"; // no error occurs
现在,你在HashSet中有两个具有相同名称的Person对象(因此,有“Equals”)。
HashSet让我们放置重复的对象。
答案 0 :(得分:9)
HashSet让我们放置重复的对象。
不允许你放入重复的对象。问题是你在添加对象后变异。
在字典中用作键的变异对象或存储为哈希的对象总是有问题的,我建议避免使用它。