GetHashCode返回不同​​的值

时间:2012-12-12 16:40:26

标签: c# linq hashcode

我正在使用Linq-to-Sql来查询SQL Server数据库。此查询返回数据库中实体的List。我的基础数据没有改变。

收到List后,我在其上调用GetHashCode以测试是否相等。奇怪的是,哈希值总是不同的。为什么总会有所不同?

谢谢,

2 个答案:

答案 0 :(得分:5)

不同的是它们是不同的对象引用。

如果您想以这种方式行事,则需要根据对象数据覆盖对象的Equals()GetHashCode()

Here您有一个关于如何操作的示例,以及here一篇关于覆盖GetHashCode()方法的指南的博文。希望它有所帮助。

class TwoDPoint : System.Object
{
    public readonly int x, y;

    public TwoDPoint(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    public override bool Equals(System.Object obj)
    {
        if (obj == null) return false;

        TwoDPoint p = obj as TwoDPoint;
        if (p == null) return false;

        // Return true if the fields match
        return (x == p.x) && (y == p.y);
    }

    public override int GetHashCode()
    {
        return x ^ y;
    }
}

正如Servy在他的评论中所说的那样,请记住,即使重写GetHashCode()方法,您也无法使用该类型的数据进行无碰撞哈希(永远),只能降低碰撞率。您需要使用Equals()来确保具有相同散列的对象实际上是相同的

答案 1 :(得分:2)

您是否覆盖了GetHashCode()?如果不是,则默认实现是基于列表的引用为您提供哈希码。它与列表的内容没有任何关系。

因此,两个不同的实例意味着两个不同的哈希码。

检查实体类上的列表相等覆盖Equals(和GetHashCode()),并在列表中使用SequenceEqual

相关问题