2014-12-08 2 views
1

У меня есть список Object (это называется: sourceList)
Object содержит: Id, Num1, Num2, num3, имя, LnameПрименение агрегатных функций к нескольким свойствам с помощью LINQ GroupBy

Предположим, у меня есть следующий список :

1, 1, 5, 9, 'a', 'b' 
1, 2, 3, 2, 'b', 'm' 
2, 5, 8, 7, 'r', 'a' 

Как я могу вернуть еще один список (из object2), который возвращает новый список:

Id, sum of num1, sum of num2 

Для приведенного выше примера, он должен возвращать список object2, который содержит:

1, 3, 8 
2, 5, 8 

Я попытался:

Dim a = sourceList.GroupBy(Function(item) item.Id). 
     Select(Function(x) x.Sum(Function(y) y.Num1)).ToList() 

Но я не знаю, как подвести num2.

ответ

2

Что вам нужно, это комбинировать анонимные типы с выражениями инициализатора, которые LINQ в свободном стиле делает это неявно. Так, например,

Dim a = sourceList.GroupBy(Function(item) item.Id). 
     Select(Function(x) New With {.Id = x.Key, 
            .Sum1 = x.Sum(Function(y) y.Num1), 
            .Sum2 = x.Sum(Function(y) y.Num2), 
            .Sum3 = x.Sum(Function(y) y.Num3)}).ToList() 

Протестировано это и, похоже, работает нормально. (Эквивалент свободно стиль

Dim fluent = (From item In sourceList 
       Group By item.Id Into Sum1 = Sum(item.Num1), 
            Sum2 = Sum(item.Num2), 
            Sum3 = Sum(item.Num3)).ToList() 

, который также прекрасно работает и, возможно, немного легче читать.)

Смежные вопросы