Я не думаю, что это на самом деле LINQ подходит для такого рода обработки - это в основном полезно для выполнения операций над целыми последовательностями, а не расщеплением или их модификации. Я сделал бы это, обратившись к базовому IEnumerator<T>
, поскольку любой метод с использованием Take
и Skip
будет довольно неэффективным.
public static void Batch<T>(this IEnumerable<T> items, int batchSize, Action<IEnumerable<T>> batchAction)
{
if (batchSize < 1) throw new ArgumentException();
List<T> buffer = new List<T>();
using (var enumerator = (items ?? Enumerable.Empty<T>()).GetEnumerator())
{
while (enumerator.MoveNext())
{
buffer.Add(enumerator.Current);
if (buffer.Count == batchSize)
{
batchAction(buffer);
buffer.Clear();
}
}
//execute for remaining items
if (buffer.Count > 0)
{
batchAction(buffer);
}
}
}
ответ LukeH является гораздо лучше, пожалуйста, принять и использовать его. – Andrey