【问题标题】:VB.NET GroupBy LINQ statementVB.NET GroupBy LINQ 语句
【发布时间】:2010-05-14 04:26:00
【问题描述】:

我正在努力让它发挥作用。我有一个名为Items 的List(Of MyItem),上面有一个OrderId 属性。从这些项目中,我想创建一个Orders 的列表。有些项目将具有相同的OrderId,所以我想尝试按OrderId 分组。然后我想按日期排序。这是我目前所拥有的:

Public ReadOnly Property AllOrders() As List(Of Order)
    Get
         Return Items.Select(Function(i As MyItem) New Order(i.OrderID)) _
         .GroupBy(Function(o As Order) New Order(o.OrderID)) _
         .OrderBy(Function(o As Order) o.DateOrdered).ToList
    End Get
End Property

这当然不能编译,我得到了错误:

“System.Collections.Generic.List(Of System.Linq.IGrouping(Of Order, Order))”类型的值无法转换为“System.Collections.Generic.List(有序))'

我已将我认为有问题的部分加粗,但我不知道如何解决它。此外,在我添加 .GroupBy 语句之前,它曾经可以正常工作(除了有重复的值)。有人有什么想法吗?

谢谢

编辑

基本上,我想要这个:

现有项目列表获取列表并将其转换为
List(Of MyItem): List(Of Order):
项目 ID 订单 ID 订单 ID
1 100 100
2 102 102
3 100

【问题讨论】:

  • 相同orderid的商品是否有相同的日期?
  • 这些项目没有日期。基本上我正在使用项目列表来获取 OrderIds 以做出正确的订单,但我不想要欺骗。我觉得我让它变得比它必须的更难:\
  • 所以你真的只想要一个唯一的 orderid 列表吗?
  • 嗯,是的。但我想用它们来创建订单

标签: vb.net linq group-by


【解决方案1】:

您不需要为此使用 group by。

Public ReadOnly Property AllOrders() As List(Of Order)
Get
     Return Items.Select(Function(i) i.OrderID).Distinct.Select(Function(p) New Order(p)).ToList()
End Get
End Property

如果要按订单上的 OrderedDate 排序,只需在 ToList 前添加 orderby 子句

Public ReadOnly Property AllOrders() As List(Of Order)
Get
     Return Items.Select(Function(i) i.OrderID).Distinct _
                 .Select(Function(p) New Order(p)) _
                 .OrderBy(Function(s) s.DateOrdered).ToList()
End Get
End Property

【讨论】:

  • 谢谢!不知道你可以在里面放一个Distinct。另外,不知道你可以这样 linq。再次感谢:)
【解决方案2】:

通过将 OrderBy 放在 GroupBy 之后,您可以指示它对组进行排序。一组订单没有单一日期。我在想你可能想要做的是切换 OrderBy 和 GroupBy ;除非 GroupBy 丢失任何先前的排序顺序,在这种情况下,您必须对每个组进行排序。

这对我来说也是错误的

.GroupBy(Function(o As Order) New Order(o.OrderID))

不应该

.GroupBy(Function(o As Order) o.OrderID)

【讨论】:

  • 所以我尝试了这个:Dim orders As List(Of Order) = Items.Select(Function(i As MyItem) New Order(i.OrderID)).OrderBy(Function(o As Order) o.DateOrdered).GroupBy(Function(o As Order) o.OrderID).ToList 并得到了与上面类似的错误: Value of type 'System.Collections.Generic.List(Of System.Linq.IGrouping(Of Integer, Order))' 不能转换为 'System.Collections.Generic.List(Of Order))'
  • 嗯,是的,可以。您正在尝试(使用 List())子句将 IGrouping 列表转换为订单列表。 Integer 只是 IGrouping 的关键。显然,现在您已经编辑了您的问题,很明显,您尝试做的事情首先与 GroupBy 无关,这解释了我们的困惑
【解决方案3】:

我说了 F 并使用了一些不太漂亮的代码:

公共只读属性 AllOrders() 作为 List(Of Order) 得到 Dim ids = Items.Select(Function(i As OrderItem) i.OrderID).Distinct() 将订单作为新列表(订单) 对于每个 i As Integer In ids orders.Add(新订单(i)) 下一个 Return orders.OrderBy(Function(o As Order) o.DateOrdered).ToList 结束获取 结束属性

如果有人有 LINQier 的做法,我更愿意这样做。否则,我想这块杂物将不得不做。

【讨论】:

  • 我采用了 geoff 的方法。我将把它留在这里,作为实现同一目的的替代方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
相关资源
最近更新 更多