Подтвердить что ты не робот

Linq group by, упорядочить по

У меня есть следующий список

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 по возрастанию, а затем получить первое значение Counter, 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, но когда первый номер был первым Я удалил 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()
4b9b3361

Ответ 1

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

Ответ 2

Группируйте записи и выбирайте победителя из каждой группы.

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