【问题标题】:Return min value in group with lambda/linq query使用 lambda/linq 查询返回组中的最小值
【发布时间】:2012-11-30 11:10:55
【问题描述】:

我需要帮助创建一个 lambda 表达式来查询以下列表,以检索每个渠道中价格最低的商品。即对于本示例项目 A、D 和 G

class Radio
{
    public string Name { get; set; }
    public int Channel { get; set; }
    public decimal Price { get; set; }
}

List<Radio> radios = new List<Radio>();
radios.Add(new Radio() { Name = "A", Channel = 1, Price = 10 });
radios.Add(new Radio() { Name = "B", Channel = 1, Price = 20 });
radios.Add(new Radio() { Name = "C", Channel = 1, Price = 30 });
radios.Add(new Radio() { Name = "D", Channel = 2, Price = 10 });
radios.Add(new Radio() { Name = "E", Channel = 2, Price = 20 });
radios.Add(new Radio() { Name = "F", Channel = 2, Price = 30 });
radios.Add(new Radio() { Name = "G", Channel = 3, Price = 10 });
radios.Add(new Radio() { Name = "H", Channel = 3, Price = 20 });
radios.Add(new Radio() { Name = "I", Channel = 3, Price = 30 });

【问题讨论】:

  • 好问题。和我的问题一样,定义得很好

标签: c# .net linq lambda linq-to-objects


【解决方案1】:

使用 Linq,

第一组使用Enumerable.GroupBy
然后使用Enumerable.OrderBy进行排序
然后取First组中每个排序的项目

    radios.GroupBy(x=> x.Channel).Select(x=>x.OrderBy(y=>y.Price)).Select(x=>x.First());

【讨论】:

    【解决方案2】:

    您也可以这样做,而无需对每个组进行昂贵的排序:

    radios.GroupBy(x => x.Channel).Select(g =>
        g.Aggregate((r1, r2) => r1.Price < r2.Price ? r1 : r2));
    

    Aggregate 遍历每个组一次,跟踪它迄今为止找到的最便宜的收音机,如果找到更便宜的收音机,则更换它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      相关资源
      最近更新 更多