2009-05-13 2 views
15

Non riesco a trovare un modo per farlo funzionare e sperare che qualcuno abbia un'idea. Un esempio semplificato sarebbe avere una lista di numeri interi da 1 a 100, voglio raggruppare ogni 3 righe in modo che il risultato sia 1,2,3 nel primo gruppo, quindi 4,5,6 nel gruppo successivo ecc. So come ottenere ogni ennesimo record ma quello di cui ho bisogno sono tutti i record quindi posso quindi aggregarli usando first, last, sum, max, ecc.Come utilizzare Linq per raggruppare ogni N numero di righe

Grazie!

+0

possibile duplicato di [Lista Spalato in sottoliste con LINQ] (http://stackoverflow.com/questions/419019/split-list-into-sublists-with-linq) – nawfal

risposta

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

Mi manca qualcosa?

+2

No, ma io ovviamente sono. Ho bisogno di dormire di più. Grazie mille !!! – RBear

+0

Essere pedante - Enumerable.Range (1, 100) poiché voleva iniziare da 1. –

+0

Se il primo numero è 0, funziona correttamente. Ma se il primo numero è 1, il primo gruppo ha un elemento in meno. Ad esempio {0,1,2}, {3,4,5}, ma {1,2}, {3,4,5}. Come risolvere questo? –

29

Questo esempio dovrebbe funzionare per l'interrogazione di raccolte non numeriche. Proietta un indice nell'oggetto da raggruppare e quindi lo rimuove nuovamente durante il raggruppamento.

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

Grazie anche, ma da dove viene l'indice? – RBear

+0

speravo che la selezione proietti il ​​suo indice nella query. Sembra che non sia così. Aggiornerò l'esempio di conseguenza, in modo che tu possa utilizzarlo con raccolte non basate su int. –

+6

FYI, nella prossima versione del framework ci sarà un metodo di estensione "zip join". Se si zip un risultato di una query con una sequenza infinita di numeri interi, si ottiene una sequenza indicizzata. Vedi il mio recente articolo del blog su questo argomento per i dettagli. –

1

Come su un approccio più semplice:

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

Aggiornamento: Se si utilizza il valore Key della voce gruppo allora si avrà bisogno di convertire il gruppo enumerabile a un elenco. Altrimenti si otterrà un diverso ogni volta che si accede.

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