c# - 使用 linq lambda 获取总计数和总和
问题描述
我有一个如下所示的数据集:
Code Fruit
A Apple
B Apple
C Orange
另一个看起来像这样:
Code Cost
A 5
B 10
C 3
我怎样才能把它变成一个包含总计数和总和的列表?
要获得如下所示的列表:
Fruit Total Items Total Cost
Apple 2 15
Orange 1 3
这是我尝试过的,但它返回一个重复的苹果列表。如何更好地编写和完成?
var totals = list1.Select(a => new totalsObject
{
Fruit = a.Fruit,
TotalItems = list2
.Count(x => list1.Any(i => i.Code== x.Code && i.Fruit == a.Fruit)),
TotalCost = list2
.Where(x => list1.Any(i => i.Code== x.Code && i.Fruit == a.Fruit))
.Sum(x => x.Cost)
})
.OrderBy(x => x.Fruit )
.ToList();
解决方案
你list2
从list1
. 这就是为什么你得到重复。相反,您应该加入这两个列表,然后将它们分组:
var totals = list1
.Join(list2, x => x.Code, x => x.Code, (a, b) => new { a.Fruit, b.Cost })
.GroupBy(x => x.Fruit)
.Select(g => new
{
Fruit = g.Key,
TotalItems = g.Count(),
TotalCost = g.Sum(x => x.Cost)
})
.OrderBy(x => x.Fruit)
.ToList();