如果我有以下方法:
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
但是当匹配在这样的范围内时,我真的不知道怎么做。
有人可以帮忙吗?
答案 0 :(得分:2)
我同意克里斯的意见
但是如果你有Date1为Oct1,Date2为Oct6,Date3为Oct12。 Date1 == Date2,Date2 == Date3,但Date1!= Date3 是一种奇怪的行为,而等于目的不是你应该使用的。
我真的不知道你是否正在开发新的东西,如果你有一个包含你的车辆索赔的数据库,但我会在数据库中将相关联的索赔作为父子关系。 你要问自己的是:你日期范围内的2辆车可能会有所不同吗? 是否还有其他财产可用于将声明标识为唯一?
也许你可以通过这种方式解决问题:
有一个
List<VehicleClaim> RelatedClaims
您的VehicleClaim对象中的属性。
使用函数
而不是Equalsbool 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天的时间段与其邻居重叠。
请不要将此标记为答案。这是一个答案,但不是答案。