GroupBy和IEqualityComparer <tkey> comparer

时间:2015-09-02 13:48:43

标签: c# linq linq-to-entities

我在LINQ中经历了GroupBy方法:

public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    IEqualityComparer<TKey> comparer
)

我了解如何使用GroupBy及其返回的内容。我想了解IEqualityComparer<TKey> comparer的重要性以及它在GroupBy中实际使用的内容。

2 个答案:

答案 0 :(得分:11)

IEqualityComparer<TKey>对象将用于执行两步检查以查看TKey实例是否与现有组的密钥“相等”,因此应该在该组中:< / p>

  1. 它针对现有密钥的哈希码检查项目的哈希码(使用GetHashCode)。如果它不等于任何这些值,则将其添加到新组
  2. 如果找到匹配的哈希码,则然后检查是否相等(使用Equals)。如果该项目“等于”组密钥,则该项目将添加到该组中。
  3. 如果提供比较器(通过传递null或使用其中一个没有该参数的重载),则使用“deafult”比较器,它使用如果TKey类实现IEquatableEqualsGetHashCode的任何适用覆盖,则Equals类本身。

    因此,这意味着GetHashCode$this->DB_Connect();之间存在一些关键关系:

    • 如果两个项目相同,则必须具有相同的哈希码。
    • 相反的情况并非如此 - 具有相同哈希码的两个项目 不等于

答案 1 :(得分:-1)

您提供了一个荒谬的平等比较器,因此您的结果将是荒谬的。您的哈希代码基于对比较器本身的引用,这与Equals方法中的任何内容无关,而在* 20 EXISTS 方法中,您说的是两个对象相等,如果第一个对象与第二个字符串一样长或长。这没有任何意义,它甚至违反了相等的基本属性,因为参数的顺序应该是无关紧要的。