linq - LINQ 恢复顺序后并行处理
问题描述
是否可以并行化 LINQ 处理链,但然后以原始顺序将结果拼接在一起?
所以对于这个管道:
var results =
_fileReader.ReadFiles(inFolder)
.OrderBy(s => s.CreateDate).ThenBy(s => s.FileName)
.Select(s => new ProcessedFile(s, isWriteSuccessful: ExecuteWrite(s, connectionString, logger)));
- 从文件夹中读取所有文件,
- 按时间顺序排列它们,
- 然后按顺序为每个文件
(a) 执行一些处理逻辑(例如提取消息)
(b) 将结果写入 db
注意:在这种特殊情况下,按时间顺序处理文件很重要,以便IDENTITY
按时间顺序分配 SQL ID
但是如果指定并行处理,那么测试表明写入文件的顺序是不确定的:
_fileReader.ReadFiles(inFolder)
.AsParallel()
.OrderBy(s => s.CreateDate).ThenBy(s => s.FileName)
.Select(s => new ProcessedFile(s, isWriteSuccessful: ExecuteWrite(s, connectionString, logger)));
但也许有一些方法可以强制缓存并行处理后的结果集,一旦所有文件处理完成,就按原始顺序将它缝合在一起(根据OrderBy
)?
解决方案
您可以使用这样的东西来创建包含原始值及其原始序列的项目集合:
public class Sequenced<T>
{
public int Sequence { get; }
public T Value { get; }
internal Sequenced(int sequence, T value)
{
Sequence = sequence;
Value = value;
}
}
public static class SequencedExtensions
{
public static IEnumerable<Sequenced<T>> AsSequenced<T>(this IEnumerable<T> source)
{
var sequence = -1;
foreach (var item in source)
{
yield return new Sequenced<T>(++sequence, item);
}
}
}
现在这将为您提供一个可以重新排序回其原始序列的集合:
var files = _fileReader.ReadFiles(inFolder)
.OrderBy(s => s.CreateDate).ThenBy(s => s.FileName)
.AsSequenced();
完成后,按顺序排列项目Sequence
,然后插入数据库。
推荐阅读
- java - java中字符的八进制表示
- jquery - 您将如何优化这个基于 jQuery 的导航菜单构建器?
- r - as.Date 函数不起作用 n 数据表
- google-cloud-platform - 在删除之前检查计算引擎实例是否存在
- sql - 我如何格式化列
- c# - 如何在c#中为excel单元格设置默认颜色?
- python - 我只想导入 spacy 但我收到 msgpack 错误
- angular - 如何完成对 REST API 的 http 调用?
- java - 数一手花色的数量
- visual-studio - 如何在未安装 VS 的 Windows 中使用“Microsoft tfs Shell Extension”