如果日期匹配正负7天,如何覆盖GetHashCode

时间:2013-10-03 12:57:13

标签: c# gethashcode

如果我有以下方法:

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但是当匹配在这样的范围内时,我真的不知道怎么做。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

我同意克里斯的意见

  

但是如果你有Date1为Oct1,Date2为Oct6,Date3为Oct12。 Date1 == Date2,Date2 == Date3,但Date1!= Date3   是一种奇怪的行为,而等于目的不是你应该使用的。

我真的不知道你是否正在开发新的东西,如果你有一个包含你的车辆索赔的数据库,但我会在数据库中将相关联的索赔作为父子关系。 你要问自己的是:你日期范围内的2辆车可能会有所不同吗? 是否还有其他财产可用于将声明标识为唯一?

也许你可以通过这种方式解决问题:

有一个

List<VehicleClaim> RelatedClaims 
您的VehicleClaim对象中的

属性。

使用函数

而不是Equals
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);
}

问题在于,您的声明必须按日期排序,而且不是最有效的方法。

答案 1 :(得分:0)

请记住:

  

如果覆盖GetHashCode方法,则还应覆盖   相等,反之亦然。如果重写的Equals方法返回true   当两个对象被测试相等时,重写的GetHashCode   方法必须为两个对象返回相同的值。

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

因此,似乎您的GetHashCode覆盖必须为所有实例返回相同的值,因为每个+ - 7天的时间段与其邻居重叠。

请不要将此标记为答案。这是一个答案,但不是答案。