using System.Collections.Generic;
public static class ChunkWhileEnumerable
public static IEnumerable<IList<T>> ChunkWhile<T>(
this IEnumerable<T> enumerable,
Func<IReadOnlyList<T>, T, bool> chunkPredicate)
var chunk = new List<T>();
foreach (var element in enumerable) {
if (chunkPredicate(chunk, element)) {
chunk = new List<T> { element };
public static void Main()
var now = DateTime.UtcNow;
new { DepartureDate = now.AddMinutes(2) },
new { DepartureDate = now.AddMinutes(5) },
new { DepartureDate = now.AddMinutes(15) },
new { DepartureDate = now.AddMinutes(31) },
new { DepartureDate = now.AddMinutes(45) },
new { DepartureDate = now.AddMinutes(50) },
new { DepartureDate = now.AddMinutes(61) },
new { DepartureDate = now.AddMinutes(74) },
new { DepartureDate = now.AddMinutes(75) },
var sorted = flights.OrderBy(d => d.DepartureDate);
var chunks = sorted.ChunkWhile((chunk, f) => {
var first = chunk.DefaultIfEmpty(f).First().DepartureDate;
var span = f.DepartureDate.Subtract(first);
return (span.TotalMinutes < 30);
foreach (var chunk in chunks) {
Console.WriteLine("Chunk ");
foreach (var flight in chunk) {
Console.WriteLine(flight.DepartureDate);