按不同对象排序和投影不同对象
本文关键字:对象 投影 排序 | 更新日期: 2023-09-27 18:23:46
我有这样的数据:
Id | Customer | CartTotal
-------------------------------
1 | a | 100
2 | a | 50
3 | b | 110
4 | b | 128
我需要按CartTotal
(降序)订购,并返回不同的客户所以我应该在我的结果集中有这个:
Id | Customer | CartTotal
-------------------------------
4 | b | 128
1 | a | 100
我想我需要做一个排序和投影。我正在使用一个强类型的IList<>
数据源。我是林的新手。。任何帮助都将不胜感激。
下面这样的东西应该能满足您的需求:
var filteredPurchases = purchases.OrderByDescending(p => p.CartTotal)
.GroupBy(p => p.Customer)
.Select(g => g.First());
它将以每个Customer
的最大CartTotal
退货,从而得到所需的结果。
到目前为止的答案虽然正确,但效率明显低于所需,因为它们1)在分组之前进行排序,2)首先只需要最大的元素。排序优先使解决方案O(n*log(n))
。
考虑到数字1,我们可以做以下操作:
var query = purchases
.GroupBy(p => p.Customer)
.Select(g => g.OrderByDescending(p => p.CartTotal).First());
这为我们提供了一个类似O(n + n * log(n/c)
的解决方案,其中c是客户数量。假设每个客户的订单大致恒定,则为O(n)
。
现在,我们可以做得更好,只需为每个客户找到最大元素并一次性选择。不幸的是,Linq中的Max运算符使这比它应该做的更痛苦。如果你拉下MoreLinq,你可以做以下操作:
var query = purchases
.GroupBy(p => p.Customer)
.Select(g => g.MaxBy(p => p.CartTotal));
该解决方案始终是O(n)
,而不管向客户分配购买。我还预计它将是迄今为止大型数据集中速度最快的。
这里有一个查询表达式版本:
var query = from cart in carts
orderby cart.CartTotal descending
group cart by cart.Customer into custCarts
select custCarts.First();