using System.Collections.Generic;
public static void Main()
var records = new List<Foo>() {
const int maxPerGroup = 3;
.SelectMany(g => g.Select((r, i) => new {
.GroupBy(g => g.Bucket, p => p.Record)
.Select(g => g.ToArray())
Members = b.Take(maxPerGroup),
Overflows = b.Skip(maxPerGroup)
new { Groups = new List<IEnumerable<Foo>>(), Overflows = new Queue<Foo>()},
acc.Groups.Add(next.Members);
foreach(var o in next.Overflows)
acc.Overflows.Enqueue(o);
new { Groups = new List<IEnumerable<Foo>>(), Overflows = t.Overflows },
var currentGroupMembers = next.ToList();
while (currentGroupMembers.Count() < maxPerGroup && dist.Overflows.Count > 0)
currentGroupMembers.Add(dist.Overflows.Dequeue());
dist.Groups.Add(currentGroupMembers);
t2.Groups.AddRange(t2.Overflows.Chunk(maxPerGroup));
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) {