1

如果我有以下方法:

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

有人可以帮忙吗?

4

2 回答 2

2

我同意克里斯的观点

但是,如果您将 Date1 作为 Oct1,将 Date2 作为 Oct6,将 Date3 作为 Oct12。Date1 == Date2, and Date2 == Date3, 但是 Date1 != Date3 是一种奇怪的行为,Equals 的目的不是你应该使用的。

我真的不知道您是否正在开发新的东西,以及您是否有一个包含您的车辆索赔的数据库,但我会将数据库中的相关索赔作为父子关系。您必须问自己的是:您的日期范围内的 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);
}

问题在于,您的索赔必须按日期排序,这不是实现这一目标的最有效方式。

于 2013-10-03T14:34:32.420 回答
0

记住:

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

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

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

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

于 2013-10-03T13:15:17.173 回答