VB.NET GroupBy LINQ оператор - PullRequest
       18

VB.NET GroupBy LINQ оператор

1 голос
/ 14 мая 2010

У меня есть время, чтобы заставить это работать. У меня есть List(Of MyItem) с именем Items, на котором есть свойство OrderId. Из этих предметов я хочу создать список Order с. Некоторые элементы будут иметь одинаковый 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. У кого-нибудь есть идеи?

Спасибо

EDIT

В принципе, я хочу это:

List of Existing Items      Take List and Turn it into 
List(Of MyItem):                 List(Of Order):
ItemId  OrderId                    OrderID 
1       100                        100
2       102                        102
3       100

Ответы [ 3 ]

3 голосов
/ 14 мая 2010

Вам не нужно использовать 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, просто добавьте предложение orderby перед списком ToList

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
0 голосов
/ 14 мая 2010

Я сказал F и использовал немного менее красивый код:

Public ReadOnly Property AllOrders() As List(Of Order)
    Get
        Dim ids = Items.Select(Function(i As OrderItem) i.OrderID).Distinct()
        Dim orders As New List(Of Order)
        For Each i As Integer In ids
            orders.Add(New Order(i))
        Next
        Return orders.OrderBy(Function(o As Order) o.DateOrdered).ToList
    End Get
End Property

Если у кого-то есть LINQier способ сделать это, я бы предпочел сделать это таким образом. В противном случае, я полагаю, этот кусок клуджа придется делать.

0 голосов
/ 14 мая 2010

Помещая OrderBy после GroupBy, вы указываете ему сортировать группы. Группа заказов не имеет единой даты. Я думаю, что вы, вероятно, хотите сделать, это переключить OrderBy и GroupBy; если GroupBy не потеряет какой-либо предыдущий порядок сортировки, в этом случае вам придется сортировать каждую группу.

Это также выглядит неправильно для меня

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

Разве это не должно быть

.GroupBy(Function(o As Order) o.OrderID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...