使用lambda过滤列表

时间:2012-01-14 00:12:50

标签: c# list lambda

我有一个包含属性ID,brandID,brandName,NumPages和Type的对象。

我需要按照numPage大小显示前五大品牌,一个品牌可能有多个ID,所以我需要按品牌分组

 listing.OrderByDescending(o => o.numPage).GroupBy(o=> o.brandName).Take(5).ToList();

仅仅是我正在寻找的行,但这不是有效的代码。

2 个答案:

答案 0 :(得分:2)

听起来某个品牌名称可能有多个ID,并且您希望排名前五的品牌按numPage排序。这是正确的

若是,请尝试以下

var query = listing
  .GroupBy(x => x.brandName)
  .OrderByDescending(brands => brands.Sum(x => x.numPage))
  .Select(x => x.Key)
  .Take(5);

注意:在GroupBy操作之后,您现在传递的是品牌对象的集合而不是单个对象。因此,要按numPage订购,我们需要为该组中的所有品牌对象求和。 .Select(x => x.Key)将选择退出该群组所基于的原始brandName

答案 1 :(得分:0)

刚刚尝试过并且有效:

public class Listing
{
    public int ID { get; set; }
    public int BrandID { get; set; }
    public string BrandName { get; set; }
    public int NumPages { get; set; }
    public Type Type { get; set; }    
}

这里过滤

Listing listing1 = new Listing() { NumPages = 2, BrandName = "xx" };
Listing listing2 = new Listing() { NumPages = 2, BrandName = "xx" };
Listing listing3 = new Listing() { NumPages = 2, BrandName = "xx" };
Listing listing4 = new Listing() { NumPages = 3, BrandName = "xxxxx" };

List<Listing> allListings = new List<Listing>() { listing1, listing2, listing3, listing4 };

var result = allListings.OrderByDescending(x => x.NumPages).GroupBy(x => x.BrandName).Take(5);