CSharp · Console
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
static void Main(string[] args)
{
var parts = 3;
var rnd = new Random();
var itemCount = rnd.Next(20);
//var itemCount = 18; // Value from question post
var input = Enumerable.Range(0, itemCount);
var result = input.Split(parts);
Console.WriteLine($"Splitting {{ {string.Join(", ", input)} }} into {parts} parts:\r\n");
foreach (var chunk in result)
{
Console.WriteLine(string.Join(", ", chunk));
}
}
}
static class LinqExtensions
{
public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> list, int parts)
{
var collection = list is ICollection<T> c
? c
: list.ToList();
var itemCount = collection.Count;
if (itemCount < parts)
{
yield return collection;
yield break;
}
var itemsInEachChunk = itemCount / parts;
var chunks = itemCount % parts == 0
? parts
: parts - 1;
var itemsToChunk = chunks * itemsInEachChunk;
foreach (var chunk in collection.Take(itemsToChunk).Chunk(itemsInEachChunk))
{
yield return chunk;
}
if (itemsToChunk < itemCount)
{
yield return collection.Skip(itemsToChunk);
}
}
}