2

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

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

谢谢,

4

2 回答 2

5

是不同的,因为它们是不同的对象引用。

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

这里有一个关于如何做的例子,这里有一篇关于覆盖该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()以确保具有相同哈希的对象确实相同

于 2012-12-12T16:42:26.427 回答
2

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

所以两个不同的实例意味着两个不同的哈希码。

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

于 2012-12-12T16:42:55.210 回答