繁体   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