對於具有屬性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