2012-02-03 40 views
13

我有以下列表LINQ組,以便通過

ID Counter SrvID FirstName 
-- ------ ----- --------- 
1 34  66M James 
5 34  66M Keith 
3 55  45Q Jason 
2 45  75W Mike 
4 33  77U Will 

我喜歡做的是通過ID訂購的上升,然後 拿到櫃檯,SrvID是相同的第一個值(如果有的話)。

所以輸出會是這樣的:

ID Counter SrvID FirstName 
-- ------ ----- --------- 
1 34  66M James 
2 45  75W Mike 
3 55  45Q Jason 
4 33  77U Will 

注意如何的5號從列表中移除,計數器和SrvID是相同的東西我有ID 1,但表示爲ID 1是先 我除去5

這是我會做什麼,但沒有工作

var result = (from ls in list1 
        group ts by new {ls.Counter, ls.SrvID} 
       order by ls.ID 
        select new{ 
          ls.ID, 
          ls.Counter.FirstOrDefault(), 
          ls.SrvID.First, 
          ls.FirstName}).ToList() 
+0

@ChrisWue - 感謝調整格式。你是怎麼把它變成一張桌子的? – 2012-02-03 17:46:42

+0

這只是標準的代碼格式:縮進4個空格 – ChrisWue 2012-02-04 00:49:53

回答

27
list1.GroupBy(item => new { Counter = item.Counter, SrvID = item.SrvID }) 
    .Select(group => new { 
     ID = group.First().ID, 
     Counter = group.Key.Counter, 
     SrvID = group.Key.SrvID, 
     FirstName = group.First().FirstName}) 
    .OrderBy(item => item.ID); 
+0

感謝您的回覆。爲什麼FirstName和ID旁邊有First()? – 2012-02-03 18:03:51

+1

GroupBy將返回一個Counter/SrvID到項目查找,每個查找成員都有一個鍵(Counter/SrvID)和相關的項目。因此,對於每個查找組,您可以從每個組的第一個匹配中的密鑰和ID和FirstName中提取Counter/SrvID。 – 2012-02-03 18:07:31

+0

@ vc74感謝您的回答。你能否詳細說明LINQ表達式中發生了什麼? – BKSpurgeon 2016-02-21 21:54:35

18

將記錄分組,並從每個組中選出一個優勝者。

var query = 
    from record in list1 
    group record by new {record.Counter, record.SrvID } into g 
    let winner = 
    (
    from groupedItem in g 
    order by groupedItem.ID 
    select groupedItem 
).First() 
    select winner; 

var otherQuery = list1 
    .GroupBy(record => new {record.Counter, record.SrvID }) 
    .Select(g => g.OrderBy(record => record.ID).First()); 
+0

謝謝你的迴應 - 請你再澄清一下var query = from list1中的記錄是否有效。再次感謝 – 2012-02-03 19:38:00

+0

這個答案的第一行可能是我見過的描述GroupBy在真實英語中的最佳使用方式。 – Clint 2014-03-06 02:03:53