按不同对象排序和投影不同对象

本文关键字:对象 投影 排序 | 更新日期: 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();
相关文章: