使用LINQ GroupBy将聚合函数应用于多个属性

时间:2014-12-08 19:12:27

标签: vb.net linq aggregate anonymous-types

我有一个Object的列表(它被称为:sourceList
Object包含:Id,Num1,Num2,Num3,Name,Lname

假设我有以下列表:

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

1 个答案:

答案 0 :(得分: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()

这也很有效,可以说更容易阅读。)