2010-07-16 47 views
1

对于具有属性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只能在任何给定时间有一个有效的帐单费率来记录他的时间。如果他需要在相同的时间段内以不同的速率记录一些小时的质量保证分析员的角色,那么这是可以的。这是一个庞大的预先存在的系统,所以更改域对象结构不是一种选择。

回答

2

这是不可能的。

.Net中的平等必须是过渡性的,这意味着如果a == bb == c,然后a == c

+0

您可以定义自己的'IsInConflictWith'样的方法,并做了N^2检验。一个更好的解决方案是将它全部放在一个'DetectConflicts'方法中,该方法通过'StartDate'命令它们,然后检查单遍的重叠。 – 2010-07-16 18:59:22

0

如果您使用的是一个哈希表,然后自己的GetHashCode方法将被用于最初测试相等,如果他们的哈希值的项目被发现相当于其Equals方法的调用将作出确定它们是否等于。

从文档:

“但是,这是不够的哈希表 ,以确定它们是相同的 对象可惜没有如果 哈希表中找到与 相同的哈希两个对象,?。它调用它们的Equals 方法来查看两个对象 实际上是否相等。同样,如果两个对象是 两个不同的实例,Object.Equals的默认实现将返回false同样的 类。所以我们还需要为我们的课程添加Equals 方法的覆盖。

2

这是可能的。 GetHashCode的唯一规则是,如果A == B,则A.GetHashCode()必须等于B.GetHashCode()。相反,如果A == B A.GetHashCode()== B.GetHashCode()不必是真正。

所以,你可以简单地做的GetHashCode像这样

public override int GetHashCode() 
{ 
    return A.GetHashCode()^B.GetHashCode()^C.GetHashCode(); 
} 

GetHashCode的不是身份!它用于分组“相似”的对象。

证明:

string a = "a"; 
string b = "EUKCnPMLpp"; 
Console.WriteLine("a = '{0}', b = '{1}', Same = {2}", a, b, a == b); 
Console.WriteLine("a.GetHashCode() = {0}, b.GetHashCode() = {1}, Same = {2}", a.GetHashCode(), b.GetHashCode(), a.GetHashCode() == b.GetHashCode()); 
+0

你的第一句话有错误。 – SLaks 2010-07-18 02:45:01

+1

这不会帮助。有可能无限数量的不相等但重叠的对象。 – SLaks 2010-07-18 02:45:34

+0

我没有犯错。您的错误是将身份与GetHashCode的目的混淆。如果你要反驳这个陈述,请提供一个具体的例子。 – Tergiver 2010-07-18 12:41:27

相关问题