C# GroupBy和IEqualityComparer<;TKey>;比较器

C# GroupBy和IEqualityComparer<;TKey>;比较器,c#,linq,linq-to-entities,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 ) 公共静态

我在LINQ学习GroupBy方法:

public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    IEqualityComparer<TKey> comparer
)
公共静态IEnumerable GroupBy(
这是一个数不清的来源,
Func键选择器,
IEqualityComparer比较器
)

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

您提供了一个无意义的相等比较程序,因此您的结果将是无意义的。哈希代码基于对比较器本身的引用,而比较器本身与
Equals
方法中的任何内容无关,在
Equals
方法中,如果第一个对象的长度等于或长于第二个字符串,则两个对象是相等的。这毫无意义,它甚至违反了等式的基本属性,因为参数的顺序应该是无关的

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

  • 它检查项的哈希代码(使用
    GetHashCode
    )与现有键的哈希代码。如果它不等于这些值中的任何一个,则将其添加到新组中
  • 如果找到匹配的哈希代码,它将检查是否相等(使用
    Equals
    )。如果该项“等于”组键,则该项将添加到该组中
  • 如果不提供比较器(通过传递
    null
    或使用其中一个没有该参数的重载),则使用“默认”比较器,如果它实现
    IEquatable
    Equals
    GetHashCode
    的任何适用重写,则使用
    TKey
    类本身

    因此,这意味着
    Equals
    GetHashCode
    之间存在一些关键关系:

    • 如果两个项相等,则它们必须具有相同的哈希代码
    • 相反的情况并非如此——具有相同哈希代码的两个项不必相等

    返回x.长度-y.长度>=0为什么要用它来衡量平等性?我只是想运行它看看它是如何工作的。我不知道如何使用它,所以我这样写是为了快速得到结果,看看它会如何工作work@VishalAnand您可以阅读文档以了解其工作原理。当你不正确地使用它时,它不会做任何明智的事情,正如你自己看到的那样。如果你不知道你到底想做什么,我们没有办法帮你。谢谢你的回复。我已经编辑了这个问题。也许现在它会更有意义。你是对的,也许实施没有意义。我只是在玩API。当我们使用OrderBy或OrderByDescending或ThenBy时,IEqualityComparer comparer用于比较订单。我无法理解在GroupBy中我会做这种事情的场景。为什么我需要分组比较。如果你能用一个能帮助我的例子来解释的话。@VishalAnand阅读文档,看看它为什么在那里,以及如何使用它。它解释了所有这些,解释得很好。谢谢