c# - GroupBy 和 IEqualityComparer<TKey> 比较器

标签 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
)

我了解如何使用 GroupBy 及其返回的内容。我想了解 IEqualityComparer<TKey> comparer 的意义以及它在 GroupBy 中的实际用途。

最佳答案

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

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

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

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

  • 如果两个项目相等,则它们必须具有相同的散列码。
  • 反之则不成立 - 具有相同散列码的两个项目必须相等。

关于c# - GroupBy 和 IEqualityComparer<TKey> 比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32355018/

相关文章:

c# - 加入错误 |无法创建仅原始类型的常量值

c# - Linq 到实体投影 : is this projection inefficient?

C# - 事件设计注意事项

c# - 'true' bool 属性计数器方法 - 这有效吗?

c# - 如何在 LINQ 中按列表合并分组

C# 按模式重新排列列表

sql - 在 Linq to Entities 中使用 COUNT 生成高效的 LEFT JOIN

c# - Linq 在没有 .GroupBy() 的情况下获取不同的有序元素

c# - xml配置文件中unity : pass parameters to custom lifetime constructor,

c# - 如何创建 nim dll 并从 C# 调用它