首页 > 解决方案 > 使用 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();

标签: c#linq

解决方案


list2list1. 这就是为什么你得到重复。相反,您应该加入这两个列表,然后将它们分组:

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();

推荐阅读