[英]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; }
}
為了讓我的類的兩個對象被認為是相等的TextField
, Value
和Product
必須相同或TextField
和Value
的屬性必須是相同的,如果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();
}
現在,此代碼可以正確地將重復項添加到TextField
, Value
和Product
規則的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.