最好的方法是使用类似from的Batch
方法MoreLinq
。
这使您可以将序列中的项目划分为指定大小的批次。
如果您想要一种不需要线程安全的简单方法(Parallel.ForEach()
例如,您不需要使用它),那么您可以使用以下扩展方法。
它的优点是无需多次调用 Skip 即可生产所有批次:
public sealed class Batch<T>
{
public readonly int Index;
public readonly IEnumerable<T> Items;
public Batch(int index, IEnumerable<T> items)
{
Index = index;
Items = items;
}
}
public static class EnumerableExt
{
// Note: Not threadsafe, so not suitable for use with Parallel.Foreach() or IEnumerable.AsParallel()
public static IEnumerable<Batch<T>> Partition<T>(this IEnumerable<T> input, int batchSize)
{
var enumerator = input.GetEnumerator();
int index = 0;
while (enumerator.MoveNext())
yield return new Batch<T>(index++, nextBatch(enumerator, batchSize));
}
private static IEnumerable<T> nextBatch<T>(IEnumerator<T> enumerator, int blockSize)
{
do { yield return enumerator.Current; }
while (--blockSize > 0 && enumerator.MoveNext());
}
}
你像这样使用它:
var items = Enumerable.Range(100, 510); // Pretend we have 50 items.
int itemsPerPage = 20;
foreach (var page in items.Partition(itemsPerPage))
{
Console.Write("Page " + page.Index + " items: ");
foreach (var i in page.Items)
Console.Write(i + " ");
Console.WriteLine();
}
但如果您需要线程安全分区,请使用我上面链接的 MoreLinq Batch 方法。