【发布时间】:2010-04-29 21:39:52
【问题描述】:
我现在对哈希集有疑问。我有不可变的类并且只包含一个项目,当我将两个具有相同数据的不同类添加到哈希集中时,我会将它们都放在集合中。这很奇怪,因为我在基类和超类上都重载了 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();
}
如您所见,所有实际工作都被推迟到作为 id 的 BigInteger 上。这是一个 .net 类,我已经确认如果我只是将 BigInteger 添加到哈希集中,我不会得到重复。
澄清一下:
BigInteger a;
HashSet<Contact> set;
set.add(new KeyOnlyContact(a));
set.add(new KeyOnlyContact(a));
set.Count == 2
【问题讨论】:
-
顺便说一句,打开警告,您应该会看到:“警告 [n] 'Foo.GetHashCode()' 隐藏继承的成员 'object.GetHashCode()'。要使当前成员覆盖该实现, 添加覆盖关键字。否则添加新关键字。”
-
我收到了警告,不幸的是,我也收到了关于未注释公共方法的警告,这是一项持续的任务,它不断地将有用的警告隐藏在烦人的文档警告中。我想我可能会改变那个选项!