如何使用 linq 构建 batches/buckets
How to build batches/buckets with linq
我需要根据以下要求从惰性可枚举创建批处理:
- 内存友好:即使在每个批次中也必须延迟加载项目(
IEnumerable<IEnumerable<T>>
,不包括解决方案构建数组)
- 解决方案不得枚举两次输入(不包括
Skip()
和 Take()
的解决方案)
- 如果不需要,解决方案不得遍历整个输入(排除
GroupBy
的解决方案)
问题类似,但对以下问题更具限制性:
How to loop through IEnumerable in batches
Create batches in 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());
}
诀窍是在内部和外部枚举之间传递老式枚举器,以实现两个批次之间的延续。
我需要根据以下要求从惰性可枚举创建批处理:
- 内存友好:即使在每个批次中也必须延迟加载项目(
IEnumerable<IEnumerable<T>>
,不包括解决方案构建数组) - 解决方案不得枚举两次输入(不包括
Skip()
和Take()
的解决方案) - 如果不需要,解决方案不得遍历整个输入(排除
GroupBy
的解决方案)
问题类似,但对以下问题更具限制性:
How to loop through IEnumerable in batches
Create batches in 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());
}
诀窍是在内部和外部枚举之间传递老式枚举器,以实现两个批次之间的延续。