簡體   English   中英

如果日期匹配(如果正負七天),如何覆蓋GetHashCode

[英]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.

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