C#LINQ:以最高价格获取商品

本文关键字:获取 最高价 C#LINQ | 更新日期: 2023-09-27 17:57:33

我有一个对象列表:

class MyObj
{
    public String Title { get; set; }
    public Decimal Price { get; set; }
    public String OtherData { get; set; }
}
var list = new List<MyObj> {
 new MyObj { Title = "AAA", Price = 20, OtherData = "Z1" },
 new MyObj { Title = "BBB", Price = 20, OtherData = "Z2" },
 new MyObj { Title = "AAA", Price = 30, OtherData = "Z5" },
 new MyObj { Title = "BBB", Price = 10, OtherData = "Z10" },
 new MyObj { Title = "CCC", Price = 99, OtherData = "ZZ" }
};

获得具有唯一标题和MAX(价格)的列表的最佳方式是什么。结果列表需要为:

var ret = new List<MyObj> {
 new MyObj { Title = "BBB", Price = 20, OtherData = "Z2" },
 new MyObj { Title = "AAA", Price = 30, OtherData = "Z5" },
 new MyObj { Title = "CCC", Price = 99, OtherData = "ZZ" }
};

C#LINQ:以最高价格获取商品

好吧,你可以做:

var query = list.GroupBy(x => x.Title)
                .Select(group =>
                {
                    decimal maxPrice = group.Max(x => x.Price);
                    return group.Where(x => x.Price == maxPrice)
                                .First();
                };

如果您需要LINQ to SQL(不能使用语句lambdas),可以使用:

var query = list.GroupBy(x => x.Title)
       .Select(group => group.Where(x => x.Price == group.Max(y => y.Price))
                             .First());

请注意,在LINQ to Objects中,与Where的每次迭代一样效率较低,它将重新计算最大价格。

如果您希望能够退货多个具有给定名称的商品(如果它们的价格相同),请调整.First()零件。

在LINQ to Objects中,您也可以使用MoreLINQ的MaxBy方法:

var query = list.GroupBy(x => x.Title)
                .Select(group => group.MaxBy(x => x.Price));
var ret = list.GroupBy(x => x.Title)
              .Select(g => g.Aggregate((a, x) => (x.Price > a.Price) ? x : a));

(如果您需要结果是List<T>而不是IEnumerable<T>序列,那么只需在末尾标记一个ToList调用即可。)

var ret = list.OrderByDescending(x => x.Price).GroupBy(x => x.Title).Select(@group => @group.ElementAt(0)).ToList();

这样就可以了。

我想提一下

var query = list.GroupBy(x => x.Title)
       .Select(group => group.Where(x => x.Price == group.Max(y => y.Price))
       .First());

应该是

var query = list.GroupBy(x => x.Title)
       .First(group => group.Where(x => x.Price == group.Max(y => y.Price)));

我喜欢Richard对最伟大的n组问题的解决方案。

var query = list
    .OrderByDescending(o => o.Price)    //set ordering
    .GroupBy(o => o.Title)              //set group by
    .Select(o => o.First());            //take the max element

然而,它需要稍微修改

var query = list
    .OrderByDescending(o => o.Price)                       //set ordering
    .GroupBy(o => o.Title)                                 //set group by
    .Select(o => o.Where(k => k.Price == o.First().Price)) //take max elements