Reputation: 383
I cannot find a way to make this work and hoping someone has an idea. A simplified example would be having a list of say integers 1-100, i want to group every 3 rows so the result would be 1,2,3 in first group then 4,5,6 in next group etc. I know how to get every nth record but what I need is all the records so I can then aggregate them, using first, last, sum, max, etc.
Thanks!
Upvotes: 25
Views: 21414
Reputation: 349
How about a simpler approach:
var index = 0;
var grpOf3s = students.GroupBy(x => index++ / 3);
Update:
If you are using the Key
value of the group item then you will need to convert the group enumerable to a list. Otherwise you will get a different Key
every time it is accessed.
var index = 0;
var grpOf3s = students.GroupBy(x => index++ / 3).ToList();
Upvotes: 2
Reputation: 41568
This example should work for querying non-numeric collections. It projects an index into the object to be grouped, and then removes it again during the grouping.
var studentQuery2 = students
.Select((student, index) => new {student, index})
.GroupBy(g => g.index / 3, i => i.student);
Upvotes: 46
Reputation: 6335
var q = Enumerable.Range(0, 100).GroupBy(x => x/3);
Am I missing something?
Upvotes: 31