我正在使用 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
实例是否“等于”现有组的键,因此应该在该组中:
- 它根据现有 key 的哈希码检查项目的哈希码(使用
GetHashCode
)。如果它不等于这些值中的任何一个,它将被添加到一个新组中 - 如果找到匹配的哈希码,它然后检查是否相等(使用
Equals
)。如果项目“等于”组 key ,则将项目添加到该组。
如果您不提供比较器(通过传递 null
或使用没有该参数的重载之一),则使用“默认”比较器,它使用 TKey
类本身如果它实现 IEquatable
或任何适用的 Equals
和 GetHashCode
覆盖。
所以这暗示了 Equals
和 GetHashCode
之间的一些关键关系:
- 如果两个项目相等,则它们必须具有相同的散列码。
- 反之则不成立 - 具有相同散列码的两个项目必须相等。
关于c# - GroupBy 和 IEqualityComparer<TKey> 比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32355018/