GroupBy和IEqualityComparer比较器

本文关键字:比较器 TKey IEqualityComparer GroupBy | 更新日期: 2023-09-27 18:10:48

我正在使用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中的实际用途。

GroupBy和IEqualityComparer<TKey>比较器

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

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

如果没有提供比较器(通过传递null或使用没有该参数的重载之一),则"default"比较器,如果它实现IEquatableEqualsGetHashCode的任何适用的覆盖,则使用TKey类本身。

这暗示了EqualsGetHashCode之间的一些关键关系:

  • 如果两个条目相等,它们必须具有相同的哈希码。
  • 相反是不正确的-具有相同哈希码的两个项不使相等。

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