using System.Collections.Generic;
public static void Main()
var a = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Console.Write($"Batched list:\n\t");
Console.WriteLine(a.Batch(3).Select(i => i.Join(",")).Join(";"));
Console.Write($"First from each batch:\n\t");
Console.WriteLine(a.Batch(3).Select(i => i.First()).Join(","));
Console.Write($"Second from each batch:\n\t");
Console.WriteLine(a.Batch(3).Select(i => i.Skip(1).First()).Join(","));
Console.Write($"Number of batches:\n\t");
Console.WriteLine(a.Batch(3).Count());
Console.Write($"Number of full batches:\n\t");
Console.WriteLine(a.Batch(3).Where(i=>i.Count() == 3).Count());
public static class BatchLinq
public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> source, int size)
throw new ArgumentOutOfRangeException("size", "Must be greater than zero.");
using (var enumerator = source.GetEnumerator())
while (enumerator.MoveNext())
var i = new BatchInner();
var e = i.Batch(enumerator, size);
public bool done = false;
public IEnumerable<T> Batch<T>(IEnumerator<T> source, int size)
do yield return source.Current;
while (++i < size && source.MoveNext());
public static string Join<T>(this IEnumerable<T> s, string j)
return string.Join(j, s.ToArray());