如何使用linq构建批次/桶

时间:2015-04-13 13:47:21

标签: c# linq group-by batch-processing bucket

我需要使用以下要求从惰性枚举中创建批次:

  • 内存友好:即使在每个批次中,项目也必须延迟加载(IEnumerable<IEnumerable<T>>,不包括解决方案构建数组)
  • 解决方案不得枚举输入的两倍(不包括Skip()Take()的解决方案)
  • 如果不需要,解决方案不得遍历整个输入(排除GroupBy的解决方案)

问题类似,但对以下内容的限制更多:

1 个答案:

答案 0 :(得分:1)

最初由@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());
}

诀窍是在内部枚举和外部枚举之间传递旧式枚举器,以便在两个批次之间继续。