c# - 哈希集中的重复元素

标签 c# .net debugging hashset

我目前遇到哈希集问题。我的类是不可变的并且只包含一个项目,当我将两个具有相同数据的不同类添加到哈希集时,我将它们都放在集合中。这很奇怪,因为我在基类和父类(super class)上都重载了 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

最佳答案

public abstract int GetHashCode();

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

如果你想要一个抽象的GetHashCode,也许:

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

现在派生类型必须提供GetHashCodeImpl,并且它们都映射到object.GetHashCode

关于c# - 哈希集中的重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2740966/

相关文章:

c# - 一个奇怪的 Visual Studio 2010 调试器案例(它不能命中断点)

c++ - 为什么 gdb 在 `absl::flat_hash_map` 中找不到元素访问函数?

java - 如何从我的 Opendaylight 项目中查看调试日志

c# - 为什么时区偏移返回不同的值?

c# - 如何使用 Visual Studio Entity Framework 代码优先迁移部署发布到 mysql 数据库

c# - 使用 C++ dll 函数提高 C# 项目的性能

c# - 使用 Ajax 在 C# 中添加 session 变量

c# - SQL Server Express 版本问题

c# - 在窗体之间切换

c++ - DirectX : Nothing is drawn on screen