代码之家  ›  专栏  ›  技术社区  ›  user215675

c选择每个地区的前2个产品详细信息

  •  2
  • user215675  · 技术社区  · 16 年前

    从给定的产品列表

    List<Product> productList = new List<Product>();
    productList.Add(new Product("P001", 34566.78M, "North"));
    productList.Add(new Product("P004", 4566.78M, "East"));
    productList.Add(new Product("P007", 14566.78M, "South"));
    
    productList.Add(new Product("P010", 2456.178M, "South"));
    productList.Add(new Product("P011", 341566.78M, "North"));
    productList.Add(new Product("P006", 64566.878M, "East"));
    
    productList.Add(new Product("P00188", 664566.78M, "East"));
    productList.Add(new Product("P00111", 3444566.78M, "North"));
    productList.Add(new Product("P00134", 3234566.78M, "South"));
    

    如何从每个地区中选择前2种产品(基于价格)?

    我写过类似的东西

    var query = productList.OrderByDescending(p => p.ProductPrice).
     Take(2).GroupBy(r => r.Region);
    
    2 回复  |  直到 16 年前
        1
  •  8
  •   Ahmad Mageed    16 年前

    首先按区域分组,然后在每个组中执行orderby/take。例如:

    var query = productList
       .GroupBy(r => r.Region)
       .Select(group => new { Region = group.Key,
                              Orders = group.OrderByDescending(p => p.ProductPrice)
                                            .Take(2) });
    
        2
  •  0
  •   mattdlong    16 年前

    它不漂亮,也不太可读,但如果你必须用一句话来表达,这对你来说就是一个诀窍。

    var q = productList.Select(pl => pl.Region)
                    .Distinct()
                    .ToList()
                    .SelectMany(region => productList.Where(pl => pl.Region == region)
                                                     .OrderByDescending(pl => pl.ProductPrice)
                                                     .Take(2));
    

    不过,为了可读性,我建议把它拆开。