Если вы имеете в виду List<T>
, вы можете использовать метод GetRange
несколько раз. Черт возьми, вы можете сделать это с помощью LINQ:
var lists = Enumerable.Range(0, (list.Count + size - 1) / size)
.Select(index => list.GetRange(index * size,
Math.Min(size, list.Count - index * size)))
.ToList();
Или вы можете просто использовать цикл, конечно:
public static List<List<T>> Split(List<T> source, int size)
{
// TODO: Prepopulate with the right capacity
List<List<T>> ret = new List<List<T>>();
for (int i = 0; i < source.Count; i += size)
{
ret.Add(source.GetRange(i, Math.Min(size, source.Count - i)));
}
return ret;
}
Это несколько более эффективно, чем использование GroupBy
, хотя оно ограничено List<T>
в качестве входа.
У нас есть другая реализация, использующая IEnumerable<T>
в MoreLINQ в Batch.cs .