2012-12-12 124 views
2

我正在使用Linq-to-Sql查询SQL Server数据库。此查询返回数据库中实体的列表。我的基础数据不会改变。GetHashCode返回不同​​的值

一旦我收到了List,我就调用GetHashCode来测试它是否相等。奇怪的是,哈希值总是不同的。为什么它总是会有所不同?

谢谢,

+0

请记住,即使您重写'GetHashCode'以基于内容,作为答案状态,您仍然需要处理碰撞,这些对象具有不同的值但解析为相同的哈希码。您将无法与该类型的数据进行无碰撞散列(以前),您只能降低冲突率。您需要使用'Equals'来确保具有相同哈希的对象真的是相同的。 – Servy

回答

5

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

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

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()以确保具有相同散列的对象真的相同

2

您覆盖了GetHashCode()?如果不是,默认实现是根据列表的参考给你一个哈希码。它不会与列表中的内容有任何关系。

所以两个不同的实例是指两个不同的哈希码。

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