2013-09-25 6 views
72

Biorąc pod uwagę następujące rekordy:Jak zdobyć pierwszy rekord w każdej grupie przy użyciu LINQ

Id   F1   F2    F3 
------------------------------------------------- 
    1   Nima   1990   10 
    2   Nima   1990   11 
    3   Nima   2000   12 
    4   John   2001   1 
    5   John   2002   2 
    6   Sara   2010   4 

Chcę grupy poprzez oparte na polu F1 i sortować według Id i uzyskać wszystkie pola z pierwszej płyty grupy podobnym do tych zapisów:

Id   F1   F2    F3 
------------------------------------------------- 
    1   Nima   1990   10 
    4   John   2001   1 
    6   Sara   2010   4 

Jak mogę to zrobić, używając linq?

+0

Jak wygląda Twoje zapytanie? –

+0

* Pytania z prośbą o kod muszą wykazywać minimalne zrozumienie problemu, który jest rozwiązywany. Dołącz przykłady rozwiązań, dlaczego nie działały i oczekiwane wyniki * – I4V

+5

Podoba mi się, jak 36-punktowe pytanie z 9 ulubionymi jest "nie na temat" ... – RareNCool

Odpowiedz

81
var res = from element in list 
       group element by element.F1 
        into groups 
        select groups.OrderBy(p => p.F2).First(); 
+1

Cieszę się, że znalazłem to. Otrzymałem komunikat o błędzie "Metoda" Pierwsza "może być użyta tylko jako operacja zapytania końcowego.Rozważ skorzystanie z metody "FirstOrDefault" w tym przypadku zamiast tego. "Z twojego przykładu Tylko operacja na liście zrobiłem po tym, jak zapytanie przekazało mi metodę myResult.ToList() do metody.Za pomocą FirstOrDefault rozwiązał ją jednak – aghost

+0

Czy to byłby' OrderBy (p => p.Id) ', chcieli go zamówić przez ID, a nie przez kolumnę roku –

+0

Czy możesz prosić o pomoc w tym zakresie: https://stackoverflow.com/questions/44764687/how-to-use-linq- do grupy według kolejności i według kolejności – Si8

92
var result = input.GroupBy(x=>x.F1,(key,g)=>g.OrderBy(e=>e.F2).First()); 
+1

To pokazało mi sposób użycia Fluent składni. [Przeciążenia dla GroupBy] (http://msdn.microsoft.com/en-us/library/vstudio/system.linq.enumerable.groupby (v = vs.100) .aspx) wydają się dawać ci dużo energii - jeden, aby dodać do długiej listy nauki! – rogersillito

+1

@rogersillito dlatego jest nazywany zapytaniem (Language Integrated Query - LINQ), a także GroupBy ma wiele przeciążeń, ale jest tylko kilka powszechnie używanych, także zależy od osobistych preferencji, takich jak niektórzy wolą napisać to jako '.GroupBy (x => x.F1). Wybierz (g => ...)', może to wyglądać na łatwiejsze do zrozumienia. –

+0

Podobny do uzyskania ** pierwszego rekordu grupy ** spróbuj [this] (http://stackoverflow.com/a/3850476/2218697), nadzieja pomaga komuś. – stom

2

awnser z @Alireza jest całkowicie poprawne, ale trzeba zauważyć, że podczas korzystania z tego kodu

var res = from element in list 
      group element by element.F1 
       into groups 
       select groups.OrderBy(p => p.F2).First(); 

który zblizonym do tego kodu, ponieważ zamawianiu listę, a następnie wykonaj grupowanie, więc otrzymujesz pierwszy wiersz grup

var res = (from element in list) 
      .OrderBy(x => x.F2) 
      .GroupBy(x => x.F1) 
      .Select() 

Teraz, jeśli chcesz zrobić coś bardziej złożonego jak wziąć ten sam wynik grupowania jednak wziąć pierwszy element F2 i ostatni element F3 lub coś bardziej niestandardowy można to zrobić poprzez studiowanie kod poniżej

var res = (from element in list) 
      .GroupBy(x => x.F1) 
      .Select(y => new 
      { 
      F1 = y.FirstOrDefault().F1; 
      F2 = y.First().F2; 
      F3 = y.Last().F3; 
      }); 

Więc dostaniesz coś takiego

F1   F2    F3 
----------------------------------- 
    Nima   1990   12 
    John   2001   2 
    Sara   2010   4 
1

Użyj go, aby osiągnąć to, co chcesz. Następnie zdecyduj, które właściwości chcesz zwrócić.

yourList.OrderBy(l => l.Id).GroupBy(l => new { GroupName = l.F1}).Select(r => r.Key.GroupName)