c# - LINQ 等于 - 它在幕后调用什么?

标签 c# .net 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>();

假设我提供的接口(interface)定义满足:

ILData : IEquatable<ILData>

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

最佳答案

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

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

  1. 这里有一个空序列。
  2. 您的断点位于 object.Equals而不是IEquatable<ILData>.Equals
  3. 第二个序列仅包含 null引用文献(这是由框架比较器检查的,因此不会输入您的引用文献)。
  4. 没有哈希匹配(来自 GetHashCode ),因此连接操作不需要进行完整的相等检查。发生这种情况的原因之一是您忘记重写此方法,因此只能使用 object 中的默认方法。 (这是为引用平等而设计的,并且与您对平等的定义不一致)。

关于c# - LINQ 等于 - 它在幕后调用什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11417245/

相关文章:

c# - 如何使用未知 T 从 ICollection<T> 获取计数

c# - 在 twitterfall.com 上查询如何访问实时 Twitter 源?

sql-server - 是否可以将全文搜索 (FTS) 与 LINQ 结合使用?

c# - 参数化 Linq 表达式帮助

c# - Linq 从对象列表中选择属性并使用简写条件修改它们

c# - 使用 C# 在 Windows CE 5.0 中创建文件

c# - 这是在 asp.net 页面之间传递变量的好方法吗

c# - 如何通过反射执行带有可选参数的私有(private)静态方法?

c# - .NET 二进制文件读取性能

c# - Windows Service下进程截图