C# LINQ equals-它在封面下叫什么?

C# LINQ equals-它在封面下叫什么?,c#,.net,linq,.net-3.5,C#,.net,Linq,.net 3.5,我在一些地方读到LINQ equals in join语法调用IEquatable来比较它所比较的类型,但我没有看到它发生在我的join中: List<ILData> list1 = new List<ILData> { /* Initialized with items */ }; List<ILData> list2 = new List<ILData> { /* Initialized with items */ }; var joinIt

我在一些地方读到LINQ equals in join语法调用IEquatable来比较它所比较的类型,但我没有看到它发生在我的join中:

List<ILData> list1 = new List<ILData> { /* Initialized with items */ };
List<ILData> list2 = new List<ILData> { /* Initialized with items */ };

var joinItems = (
    from d1 in list1
        join d2 in list2
        on d1 equals d2
    where d1.SomeValue == "7"
    select d1).Distinct().ToList<ILData>();
假设我提供了一个满足以下条件的接口定义:

ILData : IEquatable<ILData>
在这种情况下,为什么不调用ILData::Equals?

它使用EqualityComparer.Default。由于您的类型实现了IEquatable,因此实际使用的比较器将是一个名为System.Collections.Generic.GenericEqualityComparer的内部类,该类将分别将GetHashCode和Equals请求委托给object.GetHashCodemethod和IEquatable.Equals方法(空引用除外),其中,它返回零哈希代码/执行引用相等性检查,而不调用您的方法

有很多原因可以解释Equals方法没有被命中:

这里有一个空的序列。 断点位于object.Equals上,而不是IEquatable.Equals上 第二个序列只包含空引用,这是由框架比较器检查的,因此它不会输入您的。 GetHashCode中没有哈希匹配项,因此联接操作永远不需要执行完全相等性检查。发生这种情况的一个原因是,您忘记重写此方法,因此只能使用object中的默认方法,该方法是为引用相等而设计的,并且与相等的定义不一致。 该公司表示,它使用。您需要重写object.GetHashCode,除了实现IEquatable之外,还应该重写object.Equals

一般来说,查询

from AA in AAAA
join BB in BBBB
on C(AA) equals D(BB)
select E(AA,BB)
转化为

AAAA.Join(BBBB, AA => C(AA), BB => D(BB), (AA, BB) => E(AA, BB))

list1和list2是什么类型的?您可以在这里参考,它在激发相等方法时被调用@Jordrell:澄清了代码。我的比较逻辑非常复杂,我无法用GetHashCode结果表示其中任何一个,所以我让GetHashCode返回一个常量,以便每次都调用Equals。所以,4是票: