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