对于具有属性A,B,C,D,StartDate和EndDate的对象,如果我想实现任何两个对象相同(如果它们具有相同的A,B和C并且重叠日期范围,这将如何完成?Equals,GetHashCode,EqualityComparers和模糊相等
我试图创建一个EqualityComparer像这样
public override bool Equals(RateItem x, RateItem y)
{
bool equal = true;
if ((x.A != y.A || x.B != y.B || x.C != y.C ||
(x.StartDate < y.StartDate && x.EndDate <= y.StartDate) ||
(x.StartDate > y.StartDate && y.EndDate <= x.StartDate)))
{ equal = false; }
return equal;
}
但似乎很多框架中的地方忽略Equals和使用的GetHashCode和文档并不清楚这一点的。当我去实现GetHashCode时,我不知道如何让HashCodes在不忽略日期的情况下完成相同的操作。
为了使它更具体些,这与项目管理和费率有关。我想实施一项业务规则,即同一角色的同一项目上的同一个人在同一时间段内不能享受不同的费率。因此,在DeathMarch项目中担任DBA角色的Bob只能在任何给定时间有一个有效的帐单费率来记录他的时间。如果他需要在相同的时间段内以不同的速率记录一些小时的质量保证分析员的角色,那么这是可以的。这是一个庞大的预先存在的系统,所以更改域对象结构不是一种选择。
您可以定义自己的'IsInConflictWith'样的方法,并做了N^2检验。一个更好的解决方案是将它全部放在一个'DetectConflicts'方法中,该方法通过'StartDate'命令它们,然后检查单遍的重叠。 – 2010-07-16 18:59:22