GroupBy 和 IEqualityComparer<TKey> 比较器

GroupBy and IEqualityComparer<TKey> comparer

我正在使用 LINQ 中的 GroupBy 方法:

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

我了解如何使用 GroupBy 以及它的用途 returns。我想了解 IEqualityComparer<TKey> comparer 的意义以及它在 GroupBy 中的实际用途。

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

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

  1. 它根据现有键的哈希码检查项目的哈希码(使用 GetHashCode)。如果它不等于任何这些值,它将被添加到一个新组
  2. 如果找到匹配的哈希码,它会然后 检查是否相等(使用Equals)。如果项目“等于”组密钥,则将项目添加到该组。

如果您提供比较器(通过传递null或使用没有该参数的重载之一),“默认”比较器被使用,它使用 TKey class 本身,如果它实现 IEquatableEqualsGetHashCode.

的任何适用覆盖

所以这意味着 EqualsGetHashCode 之间的一些关键关系:

  • 如果两项相等,则它们必须具有相同的哈希码。
  • 反之则不然 - 具有相同散列码的两个项目 不相等。