2011-04-18 100 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 
}