Linq中按组求和的值

时间:2018-09-24 14:47:06

标签: c# linq

我从.csv文件中解析了许多Case对象,每个对象都包含brokerNameidvalue

我有一个由案例对象填充的List<Case>,我需要返回所有合并的案例的总价值,并按brokerName分组。

因此,如果存在以下数据

Case1: "Bob", 1, 200
Case2: "Bob", 2, 300
Case3: "Roger", 3, 100
Case4: "Keith", 4, 50
Case5: "Keith", 5, 300

然后返回的值将是

Bob: 500
Roger: 100
Keith: 350

我希望能够在Linq中执行此操作,但是我不知道如何获得所需的结果。我不确定如何分组然后求和。

我感觉将需要使用匿名对象来执行此操作,并且通过创建匿名对象,我可以跟踪每个代理的运行总计。但是我找不到答案。

到目前为止,我已经

var query = from c in CaseList
            group c by c.Broker
            select new
            {
                //?
            };

foreach(var c in query)
{
    decimal total = c.CaseValue;
}

但是我不确定从这里去哪里

2 个答案:

答案 0 :(得分:2)

您可以使用GroupBy的重载将分组结果转换为所需的格式:

var groups = list.GroupBy(x=> x.Broker, (broker,cases) => new { BrokerName = broker, Sum = cases.Sum(c=>c.value) });
foreach(var g in groups)
{
    Console.WriteLine($"{g.BrokerName} : {g.Sum}")
}

答案 1 :(得分:1)

Broker分组后,您可以通过Select关键字在new中创建匿名实例

var groups = list.GroupBy(x=> x.Broker)
                 .Select(g => new { BrokerName = g.Key, Sum = g.Sum(c => c.value) });
foreach(var g in groups)
{
    Console.WriteLine($"{g.BrokerName} : {g.Sum}")
}

显示喜欢的输出:

Bob: 500
Roger: 100
Keith: 350