[英]How to override GetHashCode when a Date matches if plus or minus seven days
如果我有以下方法:
public bool Equals(VehicleClaim x, VehicleClaim y)
{
bool isDateMatching = this.IsDateRangeMatching(x.ClaimDate, y.ClaimDate);
// other properties use exact matching
}
private bool IsDateRangeMatching(DateTime x, DateTime y)
{
return x >= y.AddDays(-7) && x <= y.AddDays(7);
}
當值完全匹配時,我很樂意覆蓋GetHashcode
,但是當匹配在這樣的范圍內時,我真的不知道該怎么做。
有人可以幫忙嗎?
我同意克里斯的觀點
但是,如果您將Date1作為Oct1,將Date2作為Oct6,將Date3作為Oct12。 Date1 == Date2,Date2 == Date3,但是Date1!= Date3是一種奇怪的行為,而不應使用Equals目的。
我真的不知道您是否正在開發新的東西,以及是否有一個包含車輛索賠的數據庫,但是我會將數據庫中的索賠關聯為父子關系。 您必須問自己:在您的日期范圍內,有2項車輛索賠可能不同嗎? 您還可以使用其他任何屬性將索償標識為唯一嗎?
也許您可以通過以下方式解決問題:
有一個
List<VehicleClaim> RelatedClaims
VehicleClaim對象中的屬性。
代替等於,使用函數
bool IsRelated(VehicleClaim vehiculeClaim)
{
if(all properties except date are equals)
{
// since claims are sorted by date, we could compare only with the last element
foreach(var c in RelatedClaims){
if (IsDateRangeMatching(this.ClaimDate, c.ClaimDate))
return true;
}
}
return false;
}
並添加代碼以構造您的對象
List<VehiculeClaim> yourListWithDuplicatesSortedByDate;
List<VehiculeClaim> noDuplicateList = new List<VehiculeClaim>();
foreach(var cwd in yourListWithDuplicatesSortedByDate)
{
var relatedFound = noDuplicateList.FirstOrDefault(e => e.IsRelated(cwd));
if (relatedFound != null)
relatedFound.RelatedClaims.Add(cwd);
else
noDuplicateList.Add(cwd);
}
與此相關的問題是,您的索賠必須按日期排序,這可能不是最有效的方法。
記住:
如果覆蓋GetHashCode方法,則還應該覆蓋Equals,反之亦然。 如果在測試兩個對象是否相等時重寫的Equals方法返回true,則重寫的GetHashCode方法必須為兩個對象返回相同的值。
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
因此,您的GetHashCode重寫似乎必須為所有實例返回相同的值,因為每個+-7天的時間段都與其鄰居重疊。
請不要將此標記為答案。 這是一個答案,但不是答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.