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中的实际用途。
IEqualityComparer<TKey>
对象将用于执行两步检查,以查看TKey
实例是否"相等"。到现有组的键,因此应该在该组中:
- 它根据现有密钥的哈希码检查项目的哈希码(使用
GetHashCode
)。如果不等于这些值中的任何一个,则将其添加到新组 中。 - 如果找到一个匹配的哈希码,它然后检查是否相等(使用
Equals
)。如果项目"等于" 输入组键,该项目将被添加到该组。
如果没有提供比较器(通过传递null
或使用没有该参数的重载之一),则"default"比较器,如果它实现IEquatable
或Equals
和GetHashCode
的任何适用的覆盖,则使用TKey
类本身。
这暗示了Equals
和GetHashCode
之间的一些关键关系:
- 如果两个条目相等,它们必须具有相同的哈希码。
- 相反是不正确的-具有相同哈希码的两个项不使相等。
您提供了一个无意义的相等比较器,因此您的结果将是无意义的。哈希代码基于对比较器本身的引用,这与Equals
方法中的任何内容无关,并且在Equals
方法中,如果第一个对象与第二个字符串一样长或更长,则两个对象相等。这完全没有意义,它甚至违反了相等的基本性质,因为参数的顺序应该是无关的。