C#Lambda OrderByDescending和Sum

Pau*_*aul 1 c# lambda aggregate

我想按数量总和的降序对值列表进行排序,而不会覆盖数量的原始值.

所以,假设我的数据列表是:

Reason=Quality, Quantity=10
Reason=Quality, Quantity=10
Reason=Customer, Quantity=8
Reason=Carrier, Quantity=17
Reason=Customer, Quantity=1
Run Code Online (Sandbox Code Playgroud)

我如何执行lambda表达式来按总量排序?我希望得到以下内容:

Reason=Quality, Quantity=10
Reason=Quality, Quantity=10
Reason=Carrier, Quantity=17
Reason=Customer, Quantity=8
Reason=Customer, Quantity=1
Run Code Online (Sandbox Code Playgroud)

质量是第一位的,因为总价值是20.客户是最后的,因为总价值是1.

这就是我目前所拥有的,但无论如何都没有修改数据而不修改原始数据

eData.OrderByDescending(o => o.Quantity);
Run Code Online (Sandbox Code Playgroud)

我能想到完成这项任务的唯一方法是添加另一个变量并选择Select with Sum将所有新变量添加到该值,然后将OrderByDescending添加到该值上.但是,在我这样做之前,只想看看是否有更简单的方法.

Yac*_*sad 8

您可以按项目对项目进行分组Reason,然后按Quantity每个组中的总和对组进行排序,然后使用分组将组展平为单个项目SelectMany.

var result =
    eData
        .GroupBy(x => x.Reason)
        .OrderByDescending(g => g.Sum(x => x.Quantity))
        .SelectMany(g => g)
        .ToList();
Run Code Online (Sandbox Code Playgroud)