我有一个带有Timestamp属性的模型对象,我希望按年和月分组,所以我这样做了:
'group the events by months
Dim months = Model.Events.GroupBy(Function(x) New With {x.Timestamp.Year, x.Timestamp.Month})
但这实际上是为每个事件返回一个组,即使是具有相同年份和月份的事件:
这里发生了什么?为什么GroupBy
为每个事件创建一个单独的组,而不是按年和月分组,以及如何解决此问题?
答案 0 :(得分:3)
只有不可变的Key
属性才能确定相等性。如果没有关键属性,则会获得引用相等。
New With {Key x.Timestamp.Year, Key x.Timestamp.Month}
关键属性
关键属性在几个基本方面与非关键属性不同:
仅比较关键属性的值以确定两个实例是否相等。
键属性的值是只读的,无法更改。
对于匿名类型,编译器生成的哈希码算法中只包含键属性值。
<强>平等强>
匿名类型的实例只有在它们是同一匿名类型的实例时才可以相等。如果满足以下条件,编译器会将两个实例视为相同类型的实例:
它们在同一个程序集中声明。
它们的属性具有相同的名称,相同的推断类型,并以相同的顺序声明。名称比较不区分大小写。
每个中的相同属性都标记为关键属性。
每个声明中至少有一个属性是关键属性。
没有键属性的匿名类型的实例仅与自身相等。
来自Anonymous Types (Visual Basic) 的