using System.Collections.Generic;
public static void Main()
var initialList = Enumerable.Range(1, 10).Select(i => i.ToString()).ToList();
var bucketUtility = new BucketUtility();
var list = bucketUtility.TextWithRowLimit(initialList, limit);
public sealed class BucketUtility
public List<List<string>> TextWithRowLimit(List<string> textRows, int rowLimit)
var totalRowsCount = textRows.Count;
var remainder = textRows.Count % rowLimit;
var totalBucketsNeeded = remainder == 0 ? totalRowsCount / rowLimit : (totalRowsCount / rowLimit) + 1;
var initialFillCount = totalBucketsNeeded * rowLimit;
var remainingToFill = totalRowsCount - initialFillCount;
var buckets = SizeBuckets(totalBucketsNeeded, rowLimit, remainingToFill);
var result = buckets.Select((bucketSize, i) =>
var result = textRows.Select(t => t).Skip(skip).Take(bucketSize).ToList();
private List<int> SizeBuckets(int totalBucketsNeeded, int rowLimit, int remainingToFill)
var totalBuckets = Enumerable.Range(0, totalBucketsNeeded).ToList();
var buckets = new List<int>();
for (int i = 0; i < totalBuckets.Count; i++)
int bucketSize = rowLimit;
return buckets.OrderByDescending(i => i).ToList();