LINQ等于 - 它涵盖了什么?

Joh*_*0te 2 .net c# linq .net-3.5

我在一些地方读到LINQ equals(在连接语法中)调用IEquatable来进行比较,但是我没有看到它在我的连接中发生:

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>();
Run Code Online (Sandbox Code Playgroud)

假设我提供了满足以下条件的接口定义:

ILData : IEquatable<ILData>
Run Code Online (Sandbox Code Playgroud)

要求,为什么我不会在这种情况下看到ILData :: Equals被调用?

Ani*_*Ani 5

它使用EqualityComparer<T>.Default.由于你的类型实现IEquatable<T>,所使用的实际比较器将是一个被调用的内部类 System.Collections.Generic.GenericEqualityComparer<T>,它将分别委托GetHashCodeEquals请求你的object.GetHashCode方法和IEquatable<ILData>.Equals方法(null引用除外,它返回零哈希代码/进行引用相等性检查而不调用你的方法).

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

  1. 这里有一个空的序列.
  2. 你的断点是开启object.Equals而不是IEquatable<ILData>.Equals
  3. 第二个序列只包含null引用(由框架比较器检查,因此不会输入您的引用).
  4. 没有哈希匹配(来自GetHashCode),因此连接操作永远不需要进行完全相等性检查.可能发生这种情况的一个原因是您忘记覆盖此方法,因此无法使用默认方法object(设计用于引用相等并且与您的相等定义不一致).