代码之家  ›  专栏  ›  技术社区  ›  Martin

哈希集中的重复元素

  •  2
  • Martin  · 技术社区  · 14 年前

    我现在对哈希集有个问题。我有一些不可变的类,它们只包含一个项,当我向一个hashset中添加两个不同的类,它们的数据相同时,我就在这个集中得到了它们。这很奇怪,因为我在基类和超类上都重载了Equals和GetHashCode。

    public abstract class Contact :IEquatable<Contact>
    {
        public readonly BigInteger Id;
    
        public Contact(BigInteger id) { this.Id = id; }
    
        public abstract bool Equals(Contact other);
    
        public abstract int GetHashCode();
    
        public abstract bool Equals(object obj);
    }
    

    以及继承类:

    public class KeyOnlyContact :Contact, IEquatable<KeyOnlyContact>
    {
        public KeyOnlyContact(BigInteger id) :base(id) { }
    
        public override bool Equals(object obj)
        {
            if (obj is KeyOnlyContact)
                return Equals(obj as KeyOnlyContact);
            else if (obj is Contact)
                return Equals(obj as Contact);
            else
                return (this as object).Equals(obj);
        }
    
        public override bool Equals(Contact other)
        {
            if (other is KeyOnlyContact)
                return Equals(other as KeyOnlyContact);
            else
                return (this as object).Equals(other as object);
        }
    
        public bool Equals(KeyOnlyContact other)
        {
            return other.Id.Equals(Id);
        }
    
        public override int GetHashCode()
        {
            return Id.GetHashCode();
        }
    

    澄清:

    BigInteger a;
    HashSet<Contact> set;
    
    set.add(new KeyOnlyContact(a));
    set.add(new KeyOnlyContact(a));
    
    set.Count == 2
    
    1 回复  |  直到 14 年前
        1
  •  10
  •   Marc Gravell    14 年前
    public abstract int GetHashCode();
    

    你不小心重新申报了 GetHashCode (方法隐藏)。删除此声明,它可能会开始工作。当你的派生类 override GetHashCode ,他们提供 版本-他们 不是 覆盖 object.GetHashCode

    如果你想要一个摘要 方法 ,也许:

    public sealed override int GetHashCode() { return GetHashCodeImpl(); }
    protected abstract int GetHashCodeImpl();
    

    现在是派生类型 GetHashCodeImpl ,它们都映射到 object.GetHashCode .