1

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

4

1 回答 1

11

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

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

变异对象被用作字典中的键或存储为哈希值总是有问题的,我建议避免这样做。

于 2012-10-05T18:00:52.643 回答