2011-04-18 93 views
1

采取x行我有一个看起来像这样的列表:如何使用LINQ从多列列表

catId itemId value 
    1  5   "some text" 
    1  19  "some text" 
    1  21  "some text" 
    2  6   "some text" 
    2  8   "some text" 
    3  9   "some text" 
    3  82  "some text" 

通知的catId列。我如何为第一个柱中的每个唯一值取2行(或删除额外的行)。对于catId=2等,只有2行为catId=1 2行?

我的列表被称为distinctXSelling,我使用它像这样目前:

  foreach (var item in distinctXSelling) 
      { 
       xSelling.InnerHtml += item.value; 
      } 

回答

4

您可以通过其类别的ID,然后挑选从每一组中,前两项扁平化序列前组项目将组分成一系列的源项目。这看起来像:

var query = source.GroupBy(item => item.catId) 
        .SelectMany(catGroup => catGroup.Take(2)); 

注意,Take方法需要高达一定数量的项目,因此,如果一个类只有一个项目,这将不会抛出。如BrokenGlass指出的那样,如果您希望以特定顺序排除过滤项目,则可能需要.OrderBy(并可能需要.ThenBy)。

您也可能要考虑与更换循环:

xSelling.InnerHtml = string.Concat(query.Select(item => item.value)); 
+0

可能需要添加'g.OrderBy(x => x.itemId )'否则顺序是任意的。 – BrokenGlass 2011-04-18 17:25:56

0

如果你只是希望过滤设置为特定的列,使用Where()

var onlyCatOne = mySet.Where(x => x.catId == 1) 

如果你想使用Group()

var groups = mySet.GroupBy(x => x.catId) 

foreach(var group in groups) 
{ 
    // Do Stuff 
}