【问题标题】:List take certain items skip remaning [duplicate]列出某些项目跳过remaning [重复]
【发布时间】:2014-01-29 16:52:12
【问题描述】:

假设我们有一个包含 156 个项目的列表,我们需要使用 take 和 skip 方法将它们分成 50 个批次,我已经完成了下面的代码,但不知道如何跳过以前的项目以及其余代码是否正确:

var mailAccounts = mailRepo.GetAllMailAccounts();
            int total = mailAccounts.Count;
            int batch = 50;
            int batchNumbers = total / batch;
            for (int i = 0; i < batchNumbers; i++)
            {
                mailAccounts.Skip(Previous Items).Take(batch);
                await FetchEmails(mailAccounts);
            }

【问题讨论】:

  • 考虑到当底层类型为数组时skip方法不使用索引偏移,并且总是枚举底层项目......这可能会影响性能

标签: c# linq list lambda


【解决方案1】:

您可以轻松计算它们:

int itemsToSkip = batch * i;
mailAccounts.Skip(itemsToSkip).Take(batch);

【讨论】:

  • 顺便说一句,skip 方法不考虑底层集合的类型,并在每次调用时枚举集合.. 所以性能将是 O(n^2),实际上它可以在O(n) 带循环
  • @ArsenMkrt,感谢您的评论,不知道。但是,如果 OP 会为了代码的简单性而牺牲性能,我不会反对,只有 156 个对象
  • 确实如此,对于 156 个对象,差异将不可见...
【解决方案2】:
for (int i = 0; i < batchNumbers; i++) {
     mailAccounts.Skip(i * batch).Take(batch);
}

【讨论】:

  • 顺便说一句,skip 方法不考虑底层集合的类型,并在每次调用时枚举集合.. 所以这个方法的性能将是 O(n^2),当它可以在 O(n) 上完成
【解决方案3】:
var chunks =  mailAccount.Select((m, i) => new {m, i})
                         .GroupBy(item = item.i / 50)
                         .Select(g => g.Select(item => item.m));

foreach(var ch in chunks)
{
   var curChunk = ch.ToArray();
}

【讨论】:

    猜你喜欢
    • 2013-12-30
    • 2018-09-04
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    相关资源
    最近更新 更多