.NET Fiddle

CSharp · Console

/Program.cs

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);
		}
    }
}
;