【问题标题】:LINQ GroupBy Anonymous TypeLINQ Group按匿名类型
【发布时间】:2012-04-05 07:27:09
【问题描述】:

我想知道为什么 GroupBy 可以处理匿名类型。

List<string> values = new List<string>();
values.GroupBy(s => new { Length = s.Length, Value = s })

匿名类型不实现任何接口,所以我很困惑这是如何工作的。

我假设该算法通过为源中的每个项目创建一个匿名类型的实例并使用散列将这些项目组合在一起来工作。但是,没有提供 IEqualityComparer 来定义如何生成哈希或两个实例是否相等。然后,我假设 Object.Equals 和 Object.GetHashCode 方法将是后备方法,它们依赖于对象标识。

那么,它是如何按预期工作的?但它在 OrderBy 中不起作用。匿名类型会覆盖 Equals 和 GetHashCode 吗?还是底层的 GroupBy 算法做了一些我没有想到的魔法?

【问题讨论】:

    标签: linq group-by anonymous-types


    【解决方案1】:

    根据文档,anonymous type is a reference type:

    从公共语言运行时的角度来看,匿名类型与任何其他引用类型没有什么不同。

    因此,它将使用System.Object 实现的那些函数的默认实现(至少对于equality is based on referential equality)。

    编辑:实际上,根据第一个 doco 链接,它说:

    因为匿名类型的 Equals 和 GetHashCode 方法是根据属性的 Equals 和 GetHashcode 方法定义的,所以相同匿名类型的两个实例只有在它们的所有属性都相等时才相等。

    【讨论】:

      【解决方案2】:

      http://msdn.microsoft.com/en-us/library/bb397696.aspx

      此链接说明 GetHashCode 和 Equals 覆盖。

      【讨论】:

        【解决方案3】:

        它不适用于 OrderBy,因为新对象没有实现 IComparable。

        【讨论】:

        • 不,它没有调用ToString。它正在调用GetHashCodeEquals
        • 我的错,我删除了它。 如何做删除线?
        • 罢工标签应该可以在您的实际帖子中使用。不过,他们显然是在 cmets 中逃脱了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多