我需要使用以下要求从惰性枚举中创建批次:
IEnumerable<IEnumerable<T>>
,不包括解决方案构建数组)Skip()
和Take()
的解决方案)GroupBy
的解决方案)问题类似,但对以下内容的限制更多:
答案 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());
}
诀窍是在内部枚举和外部枚举之间传递旧式枚举器,以便在两个批次之间继续。