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
实例是否“等于”现有组的键,因此应该在该组中:
- 它根据现有键的哈希码检查项目的哈希码(使用
GetHashCode
)。如果它不等于任何这些值,它将被添加到一个新组
- 如果找到匹配的哈希码,它会然后 检查是否相等(使用
Equals
)。如果项目“等于”组密钥,则将项目添加到该组。
如果您不提供比较器(通过传递null
或使用没有该参数的重载之一),“默认”比较器被使用,它使用 TKey
class 本身,如果它实现 IEquatable
或 Equals
和 GetHashCode
.
的任何适用覆盖
所以这意味着 Equals
和 GetHashCode
之间的一些关键关系:
- 如果两项相等,则它们必须具有相同的哈希码。
- 反之则不然 - 具有相同散列码的两个项目 不相等。
我正在使用 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
实例是否“等于”现有组的键,因此应该在该组中:
- 它根据现有键的哈希码检查项目的哈希码(使用
GetHashCode
)。如果它不等于任何这些值,它将被添加到一个新组 - 如果找到匹配的哈希码,它会然后 检查是否相等(使用
Equals
)。如果项目“等于”组密钥,则将项目添加到该组。
如果您不提供比较器(通过传递null
或使用没有该参数的重载之一),“默认”比较器被使用,它使用 TKey
class 本身,如果它实现 IEquatable
或 Equals
和 GetHashCode
.
所以这意味着 Equals
和 GetHashCode
之间的一些关键关系:
- 如果两项相等,则它们必须具有相同的哈希码。
- 反之则不然 - 具有相同散列码的两个项目 不相等。