我想知道有没有人对这个问题有任何建议。
我正在使用intersect和except(Linq)以及自定义的IEqualityComparer来查询两个ISyncableUsers序列的集合差异和集合交集。
public interface ISyncableUser
{
string Guid { get; }
string UserPrincipalName { get; }
}
判断两个ISyncableUsers是否相等的逻辑是有条件的。这些条件主要围绕着Guid和UserPrincipalName这两个属性是否有值。最好的方法是通过代码来解释这个逻辑。下面是我客户端IEqualityComparer Equals方法的实现:
public bool Equals(ISyncableUser userA, ISyncableUser userB)
{
if (userA == null && userB == null)
{
return true;
}
if (userA == null)
{
return false;
}
if (userB == null)
{
return false;
}
if ((!string.IsNullOrWhiteSpace(userA.Guid) && !string.IsNullOrWhiteSpace(userB.Guid)) &&
userA.Guid == userB.Guid)
{
return true;
}
if (UsersHaveUpn(userA, userB))
{
if (userB.UserPrincipalName.Equals(userA.UserPrincipalName, StringComparison.InvariantCultureIgnoreCase))
{
return true;
}
}
return false;
}
private bool UsersHaveUpn(ISyncableUser userA, ISyncableUser userB)
{
return !string.IsNullOrWhiteSpace(userA.UserPrincipalName)
&& !string.IsNullOrWhiteSpace(userB.UserPrincipalName);
}
我遇到的问题是实现GetHashCode,使得上面表示的条件相等被尊重。目前我唯一能让intersect和except方法按预期工作的方法是始终从GetHashCode()返回相同的值,强制调用Equals。
public int GetHashCode(ISyncableUser obj)
{
return 0;
}
这个方法能够实现,但是性能惩罚非常大,这是意料之中的。我测试过使用非条件相等时的情况,当两个包含50000个对象的集合,用一个合适的哈希码实现可以在约40毫秒内执行拦截和除外操作。而一个始终返回0的哈希码实现需要大约144000毫秒(是的,2.4分钟!)。
那么,在上述场景中,我应该如何实现GetHashCode()呢?
欢迎提出任何想法!