我正在看这段代码
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()
)。
两者有什么区别?
答案 0 :(得分:10)
AsSequential
只是为了阻止任何进一步的并行执行 - 因此得名。我不知道你在哪里认为它“应该使结果数组排序”。 documentation非常明确:
将ParallelQuery转换为IEnumerable以强制对查询进行顺序评估。
如你所说,AsOrdered
确保排序(针对特定序列)。
答案 1 :(得分:2)
我知道这是一年多的问题,但这是我的两分钱。
在公开的示例中,我认为它使用AsSequential,以便下一个查询运算符(在本例中为Take运算符)顺序执行。
但是,Take运算符会阻止查询被并行化,除非源元素位于其原始索引位置,这就是为什么即使删除了AsSequential运算符,结果仍然会被排序。