C#Lambda OrderByDescending和Sum

时间:2016-08-17 21:00:11

标签: c# lambda aggregate

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

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

Reason=Quality, Quantity=10
Reason=Quality, Quantity=10
Reason=Customer, Quantity=8
Reason=Carrier, Quantity=17
Reason=Customer, Quantity=1

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

Reason=Quality, Quantity=10
Reason=Quality, Quantity=10
Reason=Carrier, Quantity=17
Reason=Customer, Quantity=8
Reason=Customer, Quantity=1

质量第一是因为总价值是20。 客户是最后一个因为总价值是1。

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

eData.OrderByDescending(o => o.Quantity);

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

2 个答案:

答案 0 :(得分:8)

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

var result =
    eData
        .GroupBy(x => x.Reason)
        .OrderByDescending(g => g.Sum(x => x.Quantity))
        .SelectMany(g => g)
        .ToList();

答案 1 :(得分:0)

这应该有效:

   eData.OrderByDescending(x => eData.Where(y => y.Reason == x.Reason).Sum(y => y.Quantity));

它不是最有效的解决方案,但它可以解决问题。提高绩效的一种方法是事先用每个“原因”的总和结果创建一个字典。