[英]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 == y
和y == z
但x != z
。
另外,我們可以確定GetHashCode
的唯一合理實現是一個常量映射。
假設x
和y
是不同的對象。 設z
為對象
z = { Id = x.Id, Money = y.Money, Code = "Z" }
然后x == z
和y == z
以便x.GetHashCode() == z.GetHashCode()
和y.GetHashCode() == z.GetHashCode()
建立x.GetHashCode() == y.GetHashCode()
。 由於x
和y
是任意的,我們已經確定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;
}
坦率地說,如果Id
, Name
和Code
彼此獨立,那么我不知道你是否可以做得更好。 將這種類型的對象放在哈希表中會很痛苦。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.