10

我正在看这段代码

var numbers = Enumerable.Range(0, 20);
var parallelResult = numbers.AsParallel().AsOrdered()
    .Where(i => i % 2 == 0).AsSequential();

foreach (int i in parallelResult.Take(5))
    Console.WriteLine(i);

AsSequential()应该使结果数组排序。实际上它是在执行后排序的,但是如果我删除对 的调用AsSequential(),它仍然是排序的(因为AsOrdered())被调用。

两者有什么区别?

4

2 回答 2

12

AsSequential只是为了停止任何进一步的并行执行——因此得名。我不确定您从哪里得到“应该对结果数组进行排序”的想法。文档很清楚:

将 ParallelQuery 转换为 IEnumerable 以强制对查询进行顺序评估。

正如您所说,AsOrdered确保排序(针对该特定序列)。

于 2013-10-09T07:30:31.293 回答
2

我知道这是问了一岁多,但这是我的两分钱。

在公开的示例中,我认为它使用 AsSequential 以便下一个查询运算符(在本例中为 Take 运算符)按顺序执行。

但是,Take 运算符会阻止查询被并行化,除非源元素位于其原始索引位置,这就是为什么即使删除 AsSequential 运算符,结果仍然是排序的。

于 2015-03-07T20:13:59.030 回答