linq group by,order by

Nat*_*Pet 22 c# 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
Run Code Online (Sandbox Code Playgroud)

我喜欢做的是按ID按升序排序,然后得到Counter,SrvID的第一个值相同(如果有的话).

所以输出将是这样的:

ID  Counter  SrvID FirstName
--  ------   ----- ---------  
1   34       66M   James
2   45       75W   Mike
3   55       45Q   Jason
4   33       77U   Will
Run Code Online (Sandbox Code Playgroud)

注意如何从列表中删除ID为5,因为Counter和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()
Run Code Online (Sandbox Code Playgroud)

vc *_* 74 36

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);
Run Code Online (Sandbox Code Playgroud)


Amy*_*y B 25

将记录分组,并从每个组中挑选一名获胜者.

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;
Run Code Online (Sandbox Code Playgroud)
var otherQuery = list1
  .GroupBy(record => new {record.Counter, record.SrvID })
  .Select(g => g.OrderBy(record => record.ID).First());
Run Code Online (Sandbox Code Playgroud)