【问题标题】:Why is GroupBy multiple fields not grouping correctly>为什么 GroupBy 多个字段不能正确分组>
【发布时间】:2015-03-16 13:32:59
【问题描述】:

我有一个带有 Timestamp 属性的模型对象,我想按年和月对它们进行分组,所以我这样做了:

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

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

这里发生了什么?为什么GroupBy 为每个事件单独分组,而不是按年和月分组,我该如何解决这个问题?

【问题讨论】:

  • 你在用months做什么?

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


【解决方案1】:

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

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

关键属性

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

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

  • 关键属性的值是只读的,不能更改。

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

平等

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

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

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

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

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

没有关键属性的匿名类型的实例只等于它自己。

来自Anonymous Types (Visual Basic)

【讨论】:

  • 正是问题,您的回答立即解决了我的问题。 谢谢!我很惊讶我已经使用 LINQ 10 年了,以前从未遇到过这种情况。
  • @JoshuaFrank 我使用 C# 已经 20 年了 :-) .NET 3.5 是从 2007 年开始的 :-) :-) (它记得那些要求 10 年技术经验的工作广告前一年创建的)
  • @JoshuaFrank 在 C# 中不存在这个问题,因为它的匿名类型是不可变的,并且在相等性检查中包含所有字段。
  • 感谢“关键”提示 :-)。尽管我阅读了引用的文章,但不知何故我错过了这部分:-)
猜你喜欢
  • 2018-08-31
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 2020-12-26
  • 2018-06-29
相关资源
最近更新 更多