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被调用?
它使用EqualityComparer<T>.Default.由于你的类型实现IEquatable<T>,所使用的实际比较器将是一个被调用的内部类 System.Collections.Generic.GenericEqualityComparer<T>,它将分别委托GetHashCode和Equals请求你的object.GetHashCode方法和IEquatable<ILData>.Equals方法(null引用除外,它返回零哈希代码/进行引用相等性检查而不调用你的方法).
有很多原因可以解释您的Equals方法没有被击中:
object.Equals而不是IEquatable<ILData>.Equalsnull引用(由框架比较器检查,因此不会输入您的引用).GetHashCode),因此连接操作永远不需要进行完全相等性检查.可能发生这种情况的一个原因是您忘记覆盖此方法,因此无法使用默认方法object(设计用于引用相等并且与您的相等定义不一致).| 归档时间: |
|
| 查看次数: |
382 次 |
| 最近记录: |