不要过多地重复这个问题,但我已经进行了搜索,结果却一无所获。所以我有两个 T 类型的 EntityCollections,我想在每个中找到共同的项目。捕获?除一个以外的所有字段都必须匹配。例如,如果 T 类型是 CustomSet 类型,并且 CustomSet 包括字段 F1、F2、F3 和 FK 字段 OtherId,则 F1、F2 和 F3 必须匹配(它们可以是字符串、整数,任何东西)并且 OtherId 永远不会匹配。我目前的实现:
var intersections = source.Intersect(destination).ToList();
将永远不会产生任何结果,因为 OtherId 列将永远不会在任何其他集合中匹配,即使字段 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 是 CustomSet 类型,如果我能让它正常运行,我将为我的其他类型添加必要的 if 语句。我知道 Intersect 扩展使用 GetHashCode 而不是 Equals 来比较项目,这就是为什么我真的不在乎我的 equals 中的内容,因为除了 EntityCollections 上的 Intersect 扩展之外,永远不会调用此类。问题是,这行不通。在我的测试集上,我知道我的“源”集合中有 28 个项目,“目标”集合中有 28 个项目,并且所有字段都匹配(显然,OtherId 字段除外)。我遍历了 GetHashCode 代码,因为它循环了 56 次,并且能够匹配每组中所有 28 个项目的哈希码,但“交叉点”的计数为 0。有什么我做错或遗漏的事情吗?谢谢。}