按匿名对vs进行分组按非匿名分组

时间:2016-02-24 09:38:59

标签: linq group-by

我需要在从服务器到达之后对一些数据进行分组。

$ zpool status
  pool: rpool
 state: ONLINE
  scan: none requested
config:

    NAME      STATE     READ WRITE CKSUM
    rpool     ONLINE       0     0     0
      c1t0d0  ONLINE       0     0     0

当我按匿名对象分组时,分组正确完成。

当我按 BeneficiaryGroup 对象进行分组时,具有完全相同的属性

c1t0d0

分组未正确完成 - 该组有54条记录,与分组前一样。

我希望按类对数据进行分组,以便我可以将已经分组的集合返回给API使用者。

为什么会出现这种奇怪的行为?

1 个答案:

答案 0 :(得分:1)

匿名类型免费获得“明智的”平等行为',这就是为什么分组在这种情况下按预期工作的原因。当您切换到使用命名类时,它将成为您作为类定义者提供相等行为的责任,以允许BeneficiaryGroup以您期望的方式用作分组键。

the docs for GroupBy中所说,

  

默认的相等比较器Default用于比较密钥。

其中DefaultEqualityComparer<T>.Default,其解释为:

  

Default属性检查类型T是否实现了   System.IEquatable<T>接口,如果是,则返回一个   使用该实现的EqualityComparer<T>。否则,它   返回使用覆盖的EqualityComparer<T>   Object.Equals提供Object.GetHashCodeT

for an anonymous type

  

因为匿名类型上的EqualsGetHashCode方法是   根据{{​​1}}和Equals方法定义   属性,同一匿名类型的两个实例仅在相等时才相等   他们所有的财产都是平等的。

而对于覆盖GetHashCodeEquals的命名类型,您将获得GetHashCode实现,这些实现通常无用。