我需要在从服务器到达之后对一些数据进行分组。
$ 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使用者。
为什么会出现这种奇怪的行为?
答案 0 :(得分:1)
匿名类型免费获得“明智的”平等行为',这就是为什么分组在这种情况下按预期工作的原因。当您切换到使用命名类时,它将成为您作为类定义者提供相等行为的责任,以允许BeneficiaryGroup
以您期望的方式用作分组键。
如the docs for GroupBy
中所说,
默认的相等比较器
Default
用于比较密钥。
其中Default
是EqualityComparer<T>.Default
,其解释为:
Default属性检查类型
T
是否实现了System.IEquatable<T>
接口,如果是,则返回一个 使用该实现的EqualityComparer<T>
。否则,它 返回使用覆盖的EqualityComparer<T>
Object.Equals
提供Object.GetHashCode
和T
。
因为匿名类型上的
Equals
和GetHashCode
方法是 根据{{1}}和Equals
方法定义 属性,同一匿名类型的两个实例仅在相等时才相等 他们所有的财产都是平等的。
而对于不覆盖GetHashCode
和Equals
的命名类型,您将获得GetHashCode
实现,这些实现通常无用。