2012-01-14 238 views
0

我有一个对象,它具有属性ID,brandID,brandName,NumPages和Type。使用lambda筛选列表

我需要显示前5个品牌被numPage大小,一个品牌可能有多个ID,所以我需要按品牌

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

是孤独的什么即时寻找的线条,但这不是有效的代码。

+0

为什么它没有被有效?你是否收到错误信息或者没有得到想要的结果。 – 2012-01-14 00:18:30

回答

2

这听起来像一个给定的品牌名称可能有几个ID,并且你想要前5名品牌按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)将选择背出哪个组是基于

+0

'IGrouping'没有'numPage'成员,所以不应该编译。 – hvd 2012-01-14 00:23:26

+0

@ hvd我在Visual Studio中验证了这个编译。我的早期版本中有一个输入错误,但当前输入错误 – JaredPar 2012-01-14 00:24:12

+0

是的,我的评论是基于您确实修复过的'.OrderByDescending(x => x.numPage.Sum())'。 – hvd 2012-01-14 00:29:24

0

只是尝试了全新的brandName和它的作品:

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);