using System.Collections.Generic;
public static void Main()
var records = new List<Foo>() {
const int maxPerGroup = 3;
var groupAssigns = records
.SelectMany(g => g.Select((r, i) => new {
.GroupBy(g => g.Bucket, p => p.Record)
.Select(b => b.Chunk(maxPerGroup).ToArray())
Overflows = b.Skip(1).SelectMany(c => c)
new { Groups = new List<List<Foo>>(), Overflows = new Queue<Foo>()},
acc.Groups.Add(next.Group.ToList());
foreach(var o in next.Overflows)
acc.Overflows.Enqueue(o);
var groups = groupAssigns.Groups;
while(g.Count() < maxPerGroup && groupAssigns.Overflows.Count > 0)
g.Add(groupAssigns.Overflows.Dequeue());
groups.AddRange(groupAssigns.Overflows.Chunk(maxPerGroup).Select(c => c.ToList()));
for (int i = 0; i < groups.Count(); ++i) {
System.Console.WriteLine($"Group {i}: {Newtonsoft.Json.JsonConvert.SerializeObject(groups[i])}");
public Foo(int id, int groupId) {