我正在重构一段时间前编写的代码,当时 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/