この問題に対する提案として誰かがいるのだろうかと思っています。
私はカスタム IEqualityComparer で intersect and except (Linq) を使用して、セットの違いをクエリし、ISyncableUsers の 2 つのシーケンスの交差を設定しています。
public interface ISyncableUser
{
string Guid { get; }
string UserPrincipalName { get; }
}
2 つの ISyncableUsers が等しいかどうかの背後にあるロジックは条件付きです。条件は、Guid と UserPrincipalName の 2 つのプロパティのいずれかに値があるかどうかに集中します。このロジックを説明する最良の方法は、コードを使用することです。以下は、私の顧客である 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 個のオブジェクトを含む 2 つのセットで、適切なハッシュコード実装により、約 40 ミリ秒でインターセプトと例外を実行できます。常に 0 を返すハッシュコード実装には、約 144000 ミリ秒かかります (はい、2.4 分です!) )
では、上記のシナリオで GetHashCode() を実装するにはどうすればよいでしょうか?
どんな考えでも大歓迎です!