簡體   English   中英

如何用兩種不同的相等組合覆蓋Equals和GetHashCode

[英]How to override Equals and GetHashCode with two different combinations of equality

我正在創建包含多個屬性的自定義類的集合。 下面是課程。

public class OnlineProductHierarchy
{
    public DateTime InsertDate { get; set; }
    public string InsertUserId { get; set; }
    public DateTime AmendDate { get; set; }
    public string AmendUserId { get; set; }
    public string Product { get; set; }
    public string TextField { get; set; }
    public string Value { get; set; }
    public bool IsDefault { get; set; }
}

為了讓我的類的兩個對象被認為是相等的TextFieldValueProduct必須相同或TextFieldValue的屬性必須是相同的,如果IsDefault是真實的

因此,我有兩種不同的方法來衡量平等,如果任何一個都是正確的,則應將對象視為平等。 我這樣做是為了在創建集合以刪除重復項時可以使用HashSet。

使用普通列表並通過LINQ比較各屬性不是一個選擇,因為我需要不錯的性能。

到目前為止,我有這段代碼可以檢查我的第一個條件之間的相等性,但是我不確定如何修改它以包括我的第二個質量條件

 public override bool Equals(object obj)
    {
        OnlineProductHierarchy o = obj as OnlineProductHierarchy;

        return o != null && o.Product.ToUpper()
      == this.Product.ToUpper() &&  o.Value.ToUpper() == this.Value.ToUpper()
      && o.TextField.ToUpper() == this.TextField.ToUpper();
    }

    public override int GetHashCode()
    {
        return this.Product.ToUpper().GetHashCode() ^ 
        this.TextField.ToUpper().GetHashCode()
      ^ this.Value.ToUpper().GetHashCode();
    }

現在,此代碼可以正確地將重復項添加到TextFieldValueProduct規則的hastset中,但是如何添加到其中以包括第二條規則?

編輯

在注釋和答案的幫助下,似乎不可能在單個Equals + GetHashCode方法中執行我想要的操作。

因此,@ Lee建議的我的替代解決方案是創建兩個具有不同IEqualityComparer實現的HastSet,並且如果在執行添加i時其中任何一個都失敗了,則可以識別重復記錄。

這可以完成工作,但是正如@Lasse所建議的,您需要小心:

public override bool Equals(object obj)
{
    OnlineProductHierarchy o = obj as OnlineProductHierarchy;

    if(o == null) return false;

    return (String.Compare(o.Product, this.Product, true) &&
           String.Compare(o.Value, this.Value, true) &&
           String.Compare(o.TextField, this.TextField, true))
           ||
           (o.IsDefault == this.Isdefault &&
           String.Compare(o.Value, this.Value, true) &&
           String.Compare(o.TextField, this.TextField, true));
}

public override int GetHashCode()
{
    //Not possible using your logic
}

暫無
暫無

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

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