为什么Group By多个字段没有正确分组>

时间:2015-03-16 13:32:59

标签: .net vb.net linq grouping linq-to-objects

我有一个带有Timestamp属性的模型对象,我希望按年和月分组,所以我这样做了:

'group the events by months
Dim months = Model.Events.GroupBy(Function(x) New With {x.Timestamp.Year, x.Timestamp.Month})

但这实际上是为每个事件返回一个组,即使是具有相同年份和月份的事件: Incorrect Grouping

这里发生了什么?为什么GroupBy为每个事件创建一个单独的组,而不是按年和月分组,以及如何解决此问题?

1 个答案:

答案 0 :(得分:3)

只有不可变的Key属性才能确定相等性。如果没有关键属性,则会获得引用相等。

New With {Key x.Timestamp.Year, Key x.Timestamp.Month}
  

关键属性

     

关键属性在几个基本方面与非关键属性不同:

     
      
  • 仅比较关键属性的值以确定两个实例是否相等。

  •   
  • 键属性的值是只读的,无法更改。

  •   
  • 对于匿名类型,编译器生成的哈希码算法中只包含键属性值。

  •   
     

<强>平等

     

匿名类型的实例只有在它们是同一匿名类型的实例时才可以相等。如果满足以下条件,编译器会将两个实例视为相同类型的实例:

     
      
  • 它们在同一个程序集中声明。

  •   
  • 它们的属性具有相同的名称,相同的推断类型,并以相同的顺序声明。名称比较不区分大小写。

  •   
  • 每个中的相同属性都标记为关键属性。

  •   
  • 每个声明中至少有一个属性是关键属性。

  •   
     

没有键属性的匿名类型的实例仅与自身相等。

     来自Anonymous Types (Visual Basic)