我想按数量总和的降序排序值列表,而不会覆盖数量的原始值。
所以,假设我的数据列表是:
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添加到该值上。但是,在我这样做之前,只想看看是否有更简单的方法。
答案 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));
它不是最有效的解决方案,但它可以解决问题。提高绩效的一种方法是事先用每个“原因”的总和结果创建一个字典。