为了账号安全,请及时绑定邮箱和手机立即绑定

如何批量遍历IEnumerable

如何批量遍历IEnumerable

C#
一只萌萌小番薯 2019-11-27 13:14:37
我正在开发ac#程序,该程序具有一个“ IEnumerable用户”,其中存储了400万用户的ID。我需要遍历Ienummerable并每次提取一个批处理1000 id,以使用另一种方法执行一些操作。我如何从Ienumerable的开始一次提取1000个id ...做其他事情然后获取下一批1000等等?这可能吗?
查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

听起来您需要使用对象的“跳过”和“获取”方法。例:


users.Skip(1000).Take(1000)

这将跳过前1000个,并采用下一个1000。您只需要增加每次通话跳过的数量


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


public IEnumerable<user> GetBatch(int pageNumber)

{

    return users.Skip(pageNumber * 1000).Take(1000);

}


查看完整回答
反对 回复 2019-11-27
?
当年话下

TA贡献1890条经验 获得超9个赞

最简单的方法可能就是使用GroupByLINQ中的方法:


var batches = myEnumerable

    .Select((x, i) => new { x, i })

    .GroupBy(p => (p.i / 1000), (p, i) => p.x);

但是,对于更复杂的解决方案,请参阅此博客文章,以了解如何创建自己的扩展方法来执行此操作。为后代在此复制:


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;

}


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 1107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信