如何批量处理IEnumerable?

时间:2014-10-28 23:39:41

标签: c# .net linq batch-processing

很多时候,我的列表过程太大,我不得不将它们分成几批进行处理。

有没有办法将其封装在方法或扩展中。我似乎必须在任何地方编写这个批处理逻辑。

const int TAKE = 100;
int skip = 0;
while (skip < contacts.Count)
{
    var batch = contacts.Skip(skip).Take(TAKE).ToList();
    DoSomething(batch);
    skip += TAKE;
}

我想做类似的事情 -

Batch(contacts, DoSomething);

或类似的东西,所以我不必一次又一次地写这个批处理逻辑。

1 个答案:

答案 0 :(得分:1)

使用this thread中的批处理解决方案似乎微不足道:

const int batchSize = 100;

foreach (var batch in contacts.Batch(batchSize))
{
    DoSomething(batch);
}

如果你想把它包起来:

public static void ProcessInBatches<TSource>(
              this IEnumerable<TSource> source,
              int batchSize,
              Action<IEnumerable<TSource>> action)
{
    foreach (var batch in source.Batch(batchSize))
    {
        action(batch);
    }
}

因此,您的代码可以转换为:

const int batchSize = 100;

contacts.ProcessInBatches(batchSize, DoSomething);