c# - 排序列表和并行 Linq 查询

标签 c# linq parallel-processing

我正在重构一段时间前编写的代码,当时 linq 和委托(delegate)不存在,而且很多代码都可并行化,所以我尽可能地使用 AsParallel 但我'我不太确定当此类查询涉及有序列表时会发生什么。例如,

/* suppose we have the following list
SortedList<DateTime, SomeClass> list1
*/

var projection = list1.AsParallel().Select(t => t.Key);
var skippedProjection = list1.AsParallel().Select(t => t.Key).Skip(1);
var zipped = projection.AsParallel().Zip(skippedProjection, someComputation);

我的问题如下:并行查询中是否保留顺序?换句话说,上面的示例是否会像我预期的那样工作,或者 AsParallel 之后的 Select 查询是否会根据幕后使用的策略以随机顺序返回内容?

最佳答案

通常,使用AsParallel() 会导致结果无序。也就是说,您可以通过添加对 AsOrdered 的调用来明确指定您需要订购。 .例如:

var zipped = projection.AsParallel().AsOrdered().Zip(skippedProjection, someComputation);

有些操作会自动处理排序,因此这并不总是必需的 - 但强制执行顺序会减慢操作速度和/或减少并行度,因此通常不是默认设置。

详情推荐阅读Order Preservation in PLINQ .那篇文章详细讨论了哪些内容会保留顺序,哪些内容不会。

关于c# - 排序列表和并行 Linq 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7273471/

相关文章:

python - 复用地址和数据在并口上显示字符串

c# - 仅使用 LinqToXml 读取内部列表

c# - 使自定义类可用于 LINQ 查询

java - 如果我在多线程服务器程序中运行并行代码会发生什么?

c# - MySql.Data,无法解析,因为它是针对另一个版本构建的

c# - 使用多个 id 从列表中选择项目

c++ - "[&](int i) "是否转换为 tbb 中的引用并行?

c# - 基于模式的更智能的字符串替换

c# - 在 WPF 中使用 System.Drawing.Printing.PrintDocument

c# - 将函数转储到动态程序集中