Я думаю, что ответы, которые уже предоставлены, великолепны!
Я хотел бы поделиться своими, поскольку я люблю декларативный и краткий код.
Обратите внимание, что хотя этот код имеет лучшая читаемость , у него худшая эффективность времени выполнения , поскольку исходная коллекция перечисляется столько раз, сколько существует пакетов.
Методы расширения определены на IReadonlyCollection<T>
, а не на IEnumerable<T>
чтобы исключить лениво вычисленные перечисления, которые загружают данные из внешних источников данных.
Во-первых, некоторые помощники по расширению
public static class BatchExtensions
{
public static IEnumerable<T> TakePart<T>(this IReadOnlyCollection<T> data, int batchNumber, int batchSize) =>
data
.Skip(batchNumber * batchSize)
.Take(batchSize);
public static IEnumerable<IEnumerable<T>> Batch<T>(this IReadOnlyCollection<T> data, int batchSize) =>
Enumerable
.Range(0, data.Count / batchSize)
.Select(index => TakePart(data, index, batchSize));
}
Теперь ваш метод довольно короткий и лаконичный
async Task<IEnumerable<CreatedOrder>> BatchOrders(List<Order> orders, int batchSize)
{
var batches =
orders
.Batch(batchSize)
.Select(batch => Task.Run(() => CreateOrders(batch)))
.ToArray();
var result = (await Task.WhenAll(batches)).SelectMany(x=>x);
return result;
}