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