C#HashSet Generic允许重复

C#HashSet Generic允许重复,c#,hashset,C#,Hashset,读取MSDN上的HashSet时,它会使用HashSet,如果T实现IEquatable,则HashSet将其用于IEqualityComparer.Default 因此,让学生们: public class Person : IEquality<Person> { private string pName; public Person(string name){ pName=name; } public string Name { g

读取MSDN上的HashSet时,它会使用
HashSet
,如果T实现
IEquatable
,则HashSet将其用于
IEqualityComparer.Default

因此,让学生们:

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;}
}
公共类人员:IEquality
{
私有字符串pName;
公众人物(字符串名称){pName=name;}
公共字符串名
{
获取{return pName;}
设置
{
if(pName.Equals(value,StringComparison.invariantCultureInogoreCase))
{
回来
}
pName=值;
}
}
公共布尔等于(其他人)
{
如果(other==null){return false;}
返回pName.Equals(other.pName、StringComparison.InvariantCultureInogoreCase);
}
公共覆盖布尔等于(对象对象对象)
{
人员其他=作为人员的obj;
如果(other==null){return false;}
回报等于(其他);
}
公共重写int GetHashCode(){return pName.GetHashCode();}
公共重写字符串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=newhashset();
set.Add(newperson(“Smith”);//返回true
人员p=新人员(“Smi”);
set.Add(p);//返回true
p、 Name=“Smith”//不发生错误
现在,HashSet中有两个同名的Person对象(因此有“Equals”)

HashSet让我们放置重复的对象

HashSet让我们放置重复的对象

它不允许您放入重复的对象。问题是您在添加对象后正在对其进行变异

在字典中用作键或存储为散列的对象的变化总是有问题的,我建议避免这种情况

HashSet让我们放置重复的对象

它不允许您放入重复的对象。问题是您在添加对象后正在对其进行变异


在字典中用作突变键的对象或作为哈希存储的对象总是有问题的,并且我建议避免。

同意,您应该考虑删除人的设置器,使人不可变,并防止这种情况。同意,您应该考虑删除人的设置,使人不可变,并防止这种情况发生。.