Custom IequalityCompererを介して2つのエンティティコレクションと交差します
-
24-10-2019 - |
質問
この質問をあまり繰り返すことはありませんが、私はすでに検索を行い、結果として空っぽになりました。そのため、タイプTの2つのエンティティコレクションがあり、それぞれに一般的なアイテムを見つけたいと思います。キャッチ? 1つを除くすべてのフィールドは一致する必要があります。たとえば、タイプTがタイプカスタムセットであり、カスタムセットにフィールドF1、F2、F3、およびFKフィールドが含まれる場合、その他、F1、F2、F3が一致する必要があります(文字列、INT、何でもあります)。マッチ。私の現在の実装:
var intersections = source.Intersect(destination).ToList();
フィールドF1、F2、およびF3が一致する場合でも、他のコレクションで他の列が一致することはないため、結果が得られません。だから私はこのように見えるiequalitycomparerのカスタム実装を提案しています:
var intersections = source.Intersect(destination, new EntityCollectionComparer<T>()).ToList();
public class EntityCollectionComparer<T> : IEqualityComparer<T>
{
#region IEqualityComparer<T> Members
public bool Equals(T x, T y)
{
if (x.Equals(y))
return true;
else
return false;
}
public int GetHashCode(T obj)
{
if (obj is CustomSet)
{
CustomSet temp = obj as CustomSet;
return (temp.F1.GetHashCode() ^ temp.F2.GetHashCode() ^ temp.F3.GetHashCode());
}
return obj.GetHashCode();
}
今、私はこれをテストしているので、OBJが渡されることはカスタムセットのタイプです。これを適切に機能させることができれば、他のタイプのステートメントが必要な場合は必要になります。 Intersect Extensionは、等しいものではなくGethashCodeを使用してアイテムを比較することを知っています。そのため、このクラスは決して呼び出されることはありません。事は、これはうまくいきません。私のテストセットでは、「ソース」コレクションに28のアイテムと、「Destination」コレクションに28のアイテムがあり、すべてのフィールドが一致していることを知っています(明らかに他のフィールドを除く)。 Gethashcodeコードは56回ループし、各セットの28項目すべてのハッシュコードを一致させることができましたが、「交差点」は0カウントを生成しました。私が間違っていること、または欠けていることはありますか?ありがとう。 }
解決
これがあなたの問題です:
Intersect Extensionは、等しいものではなくGethashCodeを使用してアイテムを比較することを知っています。そのため、このクラスは決して呼び出されることはありません。
それは単に真実ではありません。 GetHashCode
バケツ値の最初の「迅速な」方法として使用されますが、 Equals
同じハッシュのあるアイテムの場合でも呼び出されます。そうしないと、それらが等しいことを知ることができません。
それがハッシュテーブルなどが常に機能する方法です。ハッシュは、パフォーマンス上の理由で実行可能な場合は不平等な値で異なるはずですが、 許可された 衝突する。