2009-05-13 11 views
15

Nie mogę znaleźć sposobu, aby to zadziałało i mam nadzieję, że ktoś ma pomysł. Uproszczonym przykładem będzie lista liczb całkowitych 1-100, chcę zgrupować co 3 wiersze, aby wynik był 1,2,3 w pierwszej grupie, następnie 4,5,6 w następnej grupie itd. Wiem, jak Zdobądź każdą n-tą płytę, ale potrzebuję wszystkich rekordów, abym mógł je zebrać, używając pierwszej, ostatniej, sumy, maksimum, itd.Jak używać Linq do grupowania każdej liczby N wierszy

Dzięki!

+0

możliwe duplikat [Lista podzielona na podlisty z LINQ] (http://stackoverflow.com/questions/419019/split-list-into-sublists-with-linq) – nawfal

Odpowiedz

22
var q = Enumerable.Range(0, 100).GroupBy(x => x/3); 

Czy czegoś brakuje?

+2

No ale ja oczywiście jestem. Potrzebuje wiecej snu. Dzięki wielkie!!! – RBear

+0

Będąc pedantycznym - Enumerable.Range (1, 100), ponieważ chciał zacząć od 1. –

+0

Jeśli pierwsza liczba to 0, działa dobrze. Ale jeśli pierwsza liczba to 1, pierwsza grupa ma jeden mniej element. Na przykład {0,1,2}, {3,4,5}, ale {1,2}, {3,4,5}. Jak to naprawić? –

29

Ten przykład powinien działać w przypadku zapytań o kolekcje inne niż liczbowe. Wyświetla indeks do obiektu, który ma zostać zgrupowany, a następnie usuwa go ponownie podczas grupowania.

var studentQuery2 = students 
    .Select((student, index) => new {student, index}) 
    .GroupBy(g => g.index/3, i => i.student); 
+0

Dziękuję również, ale skąd się bierze indeks? – RBear

+0

Miałem nadzieję, że selekcja wyświetli indeks w zapytaniu. Wygląda na to, że tak nie jest. Odpowiednio zaktualizuję ten przykład - abyś mógł go użyć w kolekcjach nie opartych na int. –

+6

FYI, w następnej wersji framework będzie metoda rozszerzenia "zip join". Jeśli spakujesz wynik zapytania w nieskończonej sekwencji liczb całkowitych, otrzymasz indeksowaną sekwencję. Zobacz mój ostatni artykuł na blogu na ten temat po więcej szczegółów. –

1

Jak o prostszej metody:

var index = 0; 
var grpOf3s = students.GroupBy(x => index++/3); 

Aktualizacja: Jeśli używasz wartości Key elementu grupowego następnie trzeba będzie przekształcić grupę enumerable do listy. W przeciwnym razie otrzymasz inny Key za każdym razem, gdy będzie on dostępny.

var index = 0; 
var grpOf3s = students.GroupBy(x => index++/3).ToList(); 
Powiązane problemy