首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何批量循环遍历IEnumerable

如何批量循环遍历IEnumerable
EN

Stack Overflow用户
提问于 2013-03-15 00:06:22
回答 8查看 72.8K关注 0票数 95

我正在开发一个具有"IEnumerable users“的用户程序,其中存储了4,000,000个用户的ids。我需要遍历Ienummerable并每次提取一个批次1000ID,以便在另一个方法中执行一些操作。

如何从可枚举...do的开头一次提取1000个ids,然后获取下一批1000个ids,依此类推?

这个是可能的吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-03-15 00:10:38

听起来你需要使用对象的Skip和Take方法。示例:

users.Skip(1000).Take(1000)

这将跳过前1000个,然后取下一个1000。您只需增加每次调用跳过的数量

您可以将整数变量与Skip的参数一起使用,并且可以调整跳过的量。然后,您可以在方法中调用它。

public IEnumerable<user> GetBatch(int pageNumber)
{
    return users.Skip(pageNumber * 1000).Take(1000);
}
票数 58
EN

Stack Overflow用户

发布于 2013-03-15 00:08:17

最简单的方法可能就是在LINQ中使用GroupBy方法:

var batches = myEnumerable
    .Select((x, i) => new { x, i })
    .GroupBy(p => (p.i / 1000), (p, i) => p.x);

但对于更复杂的解决方案,请参阅此blog post,了解如何创建自己的扩展方法来实现此目的。在这里复制给后人:

public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> collection, int batchSize)
{
    List<T> nextbatch = new List<T>(batchSize);
    foreach (T item in collection)
    {
        nextbatch.Add(item);
        if (nextbatch.Count == batchSize)
        {
            yield return nextbatch;
            nextbatch = new List<T>(); 
            // or nextbatch.Clear(); but see Servy's comment below
        }
    }

    if (nextbatch.Count > 0)
        yield return nextbatch;
}
票数 31
EN

Stack Overflow用户

发布于 2013-03-15 00:11:45

尝试使用以下命令:

  public static IEnumerable<IEnumerable<TSource>> Batch<TSource>(
        this IEnumerable<TSource> source,
        int batchSize)
    {
        var batch = new List<TSource>();
        foreach (var item in source)
        {
            batch.Add(item);
            if (batch.Count == batchSize)
            {
                 yield return batch;
                 batch = new List<TSource>();
            }
        }

        if (batch.Any()) yield return batch;
    }

并使用上面的函数:

foreach (var list in Users.Batch(1000))
{

}
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15414347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档