C# 如何使用LINQ按组合并/求和记录?

C# 如何使用LINQ按组合并/求和记录?,c#,linq,C#,Linq,例如,如何使用LINQ按GroupId对以下记录进行分组,并对每组中的所有其他列求和?(从而将每组中的所有行合并为一行) 使用GroupBy根据Foo的GroupId将其收集到组中,然后为结果的每个“行”创建一个新对象(根据您给出的代码,该对象可以是Foo本身,但也可以是其他任何对象,包括匿名类型)。在这一点上,您还将对其他值求和 var sums = list.GroupBy(f => f.GroupId) .Select(g => new Foo

例如,如何使用LINQ按
GroupId
对以下记录进行分组,并对每组中的所有其他列求和?(从而将每组中的所有行合并为一行)


使用
GroupBy
根据
Foo
GroupId
将其收集到组中,然后为结果的每个“行”创建一个新对象(根据您给出的代码,该对象可以是
Foo
本身,但也可以是其他任何对象,包括匿名类型)。在这一点上,您还将对其他值求和

var sums = list.GroupBy(f => f.GroupId)
               .Select(g => new Foo
               { 
                   GroupId = g.Key, 
                   ValueA = g.Sum(f => f.ValueA),
                   ValueB = g.Sum(f => f.ValueB)
               }).ToList();
或者只是为了好玩,您可以使用其重载在一次
GroupBy
呼叫中执行此操作:

list.GroupBy(i => i.GroupId,
       (key, groupedItems) => new {
                                      GroupId = key,
                                      ValueA = groupedItems.Sum(i => i.ValueA),
                                      ValueB = groupedItems.Sum(i => i.ValueB),
                                  });
或者您可以使用
Aggregate
避免对每个组进行多次迭代:

list.GroupBy(i => i.GroupId)
    .Select(g => g.Aggregate((i1, i2) => new Foo{ GroupId = i1.GroupId,
                                                  ValueA = i1.ValueA + i2.ValueA,
                                                  ValueB = i1.ValueB + i2.ValueB,
                                                }));

避免lambda表达式(几乎)并使用“纯”LINQ方式:

var sums = from foo in list
    group foo by foo.GroupId into groupings
    orderby groupings.Key ascending
    select new
    {
        GroupId = groupings.Key,
        ValueA = groupings.Sum(g => g.ValueA),
        ValueB = groupings.Sum(g => g.ValueB)
    };
我只是觉得与lambda相比,LINQ的语言看起来更自然一些(并不是说这有什么不对…)

list.GroupBy(i => i.GroupId)
    .Select(g => new { GroupId = g.Key, 
                       ValueA = g.Sum(i => i.ValueA), 
                       ValueB = g.Sum(i => i.ValueB)});
list.GroupBy(i => i.GroupId,
       (key, groupedItems) => new {
                                      GroupId = key,
                                      ValueA = groupedItems.Sum(i => i.ValueA),
                                      ValueB = groupedItems.Sum(i => i.ValueB),
                                  });
list.GroupBy(i => i.GroupId)
    .Select(g => g.Aggregate((i1, i2) => new Foo{ GroupId = i1.GroupId,
                                                  ValueA = i1.ValueA + i2.ValueA,
                                                  ValueB = i1.ValueB + i2.ValueB,
                                                }));
var sums = from foo in list
    group foo by foo.GroupId into groupings
    orderby groupings.Key ascending
    select new
    {
        GroupId = groupings.Key,
        ValueA = groupings.Sum(g => g.ValueA),
        ValueB = groupings.Sum(g => g.ValueB)
    };