簡體   English   中英

C#GetHashCode問題

[英]C# GetHashCode question

如果我的對象被認為是相等的,如果它們中至少有一個字段匹配,那么覆蓋案例的GetHashCode函數的最佳方法是什么。

在通用Equals方法的情況下,示例可能如下所示:

    public bool Equals(Whatever other)
    {
        if (ReferenceEquals(null, other)) return false;
        if (ReferenceEquals(this, other)) return true;

        // Considering that the values can't be 'null' here.
        return other.Id.Equals(Id) || Equals(other.Money, Money) ||
               Equals(other.Code, Code);
    }

盡管如此,我對於為這種情況制作一個好的GetHashCode實現感到困惑。

該怎么做?

謝謝。

這是對Equals的可怕定義,因為它不具有傳遞性。

考慮

x = { Id = 1, Money = 0.1, Code = "X" }
y = { Id = 1, Money = 0.2, Code = "Y" }
z = { Id = 3, Money = 0.2, Code = "Z" }

然后x == yy == zx != z

另外,我們可以確定GetHashCode的唯一合理實現是一個常量映射。

假設xy是不同的對象。 z為對象

z = { Id = x.Id, Money = y.Money, Code = "Z" }

然后x == zy == z以便x.GetHashCode() == z.GetHashCode()y.GetHashCode() == z.GetHashCode()建立x.GetHashCode() == y.GetHashCode() 由於xy是任意的,我們已經確定GetHashCode是常量。

因此,我們已經證明GetHashCode唯一可能的實現是

private readonly int constant = 17;
public override int GetHashCode() {
    return constant;
}

所有這些放在一起表明你需要重新思考你正在嘗試模型的概念,並提出不同的Equals定義。

我不認為你應該使用Equals。 人們有一個非常明確的概念,即等於什么意思,如果ID不同但代碼或名稱相同,我不會認為那些“平等”。 也許你需要一個像“IsCompatible”這樣的不同方法。

如果您希望能夠對它們進行分組,則可以在這些對象的列表上使用擴展方法ToLookup(),以使用謂詞,該謂詞將是您的IsCompatible方法。 然后他們將被分組。

黃金法則是: 如果對象比較相等,則它們必須生成相同的哈希碼。

因此,符合(但假設,不合需要)的實現將是

public override int GetHashCode()
{
    return 0;
}

坦率地說,如果IdNameCode彼此獨立,那么我不知道你是否可以做得更好。 將這種類型的對象放在哈希表中會很痛苦。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM