C#HashSet Generic允许重复

时间:2012-10-05 17:57:22

标签: c# hashset

在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让我们放置重复的对象。

1 个答案:

答案 0 :(得分:9)

  

HashSet让我们放置重复的对象。

不允许你放入重复的对象。问题是你在添加对象后变异

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