2012-02-03 18 views
13

mam Poniższa listaLINQ grupa przez postanowienie o

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

Co chciałbym zrobić, to zamówić przez ID przez wstępujących i następnie uzyskać pierwszą wartość licznika, srvid które są identyczne (jeśli w ogóle).

więc wyjście byłoby coś takiego:

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

nocie jak ID 5 jest usuwana z listy jako licznik i srvid był identyczny do tego, co miałem do ID 1, ale jako ID 1 przyszedł pierwszy I usunięte 5.

to jest to, co chciałbym zrobić, ale nie działa

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 - Dzięki za szczypanie formatowanie. Jak sformatowałeś go w tabeli? –

+0

To tylko standardowe formatowanie kodu: wcięcie o 4 spacje – ChrisWue

Odpowiedz

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

Dziękuję za odpowiedź. Dlaczego masz First() obok FirstName i ID? –

+1

GroupBy zwróci ci Counter/SrvID do wyszukiwania pozycji, każdy członek wyszukiwania ma klucz (Counter/SrvID) i powiązane elementy. Tak więc dla każdej grupy wyszukiwania można wyodrębnić Counter/SrvID z klucza i ID oraz FirstName z pierwszego dopasowania w każdej grupie. –

+0

@ vc74 Dziękuję za odpowiedź. czy byłbyś w stanie wyjaśnić, co się dzieje w wyrażeniu LINQ? – BKSpurgeon

18

Zgrupuj rekordy i wybierz zwycięzcę z każdej grupy.

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

Dziękuję za odpowiedź - czy możesz wyjaśnić dalej, jak działa var query = z rekordu na liście1. Jeszcze raz dziękuję –

+0

Pierwsza linia tej odpowiedzi jest prawdopodobnie najlepszym sposobem, jaki opisałem używając GroupBy w prawdziwym języku angielskim. – Clint