C# LINQ equals-它在封面下叫什么?
我在一些地方读到LINQ equals in join语法调用IEquatable来比较它所比较的类型,但我没有看到它发生在我的join中: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
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是票: