如何使用 linq 构建 batches/buckets

How to build batches/buckets with linq

我需要根据以下要求从惰性可枚举创建批处理:


问题类似,但对以下问题更具限制性:

最初由@Nick_Whaley 在 Create batches in linq 中发布,但不是最佳回复,因为问题的表述方式不同:

试试这个:

public static IEnumerable<IEnumerable<T>> Bucketize<T>(this IEnumerable<T> items, int bucketSize)
{
    var enumerator = items.GetEnumerator();
    while (enumerator.MoveNext())
        yield return GetNextBucket(enumerator, bucketSize);
}

private static IEnumerable<T> GetNextBucket<T>(IEnumerator<T> enumerator, int maxItems)
{
    int count = 0;
    do
    {
        yield return enumerator.Current;

        count++;
        if (count == maxItems)
            yield break;

    } while (enumerator.MoveNext());
}

诀窍是在内部和外部枚举之间传递老式枚举器,以实现两个批次之间的延续。