using System.Collections.Generic;
public static void Main()
var a = Enumerable.Range(0,11).ToArray();
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())
do yield return enumerator.Current;
while (++i < size && enumerator.MoveNext());
while (++i < size && enumerator.MoveNext());
public static string Join<T>(this IEnumerable<T> s, string j)
return string.Join(j, s.ToArray());