GroupBy和IEqualityComparer <TKey>比较器

Vis*_*and 7 c# linq linq-to-entities

我在LINQ中经历了GroupBy方法:

public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    IEqualityComparer<TKey> comparer
)
Run Code Online (Sandbox Code Playgroud)

我理解如何使用GroupBy以及它返回的内容.我想了解IEqualityComparer<TKey> comparerGroupBy中实际使用的含义和含义.

D S*_*ley 11

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

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

如果您还没有提供一个比较器(无论是通过传递null或使用不具有该参数的重载之一),该"deafult"比较器使用,它使用了TKey类本身是否实现IEquatable或任何适用的覆盖EqualsGetHashCode.

所以这意味着Equals和之间的一些关键关系GetHashCode:

  • 如果两个项相等,则它们必须具有相同的哈希码.
  • 相反的是不正确的-具有相同的散列码没有两个项目相等.