Сортированные списки и параллельные запросы Linq

Я рефакторинг кода, который был написан некоторое время назад, когда linq и делегаты не существовали, и многие из кода смущающе распараллеливаются, поэтому я использую 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);

мой вопрос заключается в следующем: сохраняется ли порядок в параллельных запросах? Другими словами, приведенный выше пример будет работать так, как я ожидаю, или будет Select вопрос AsParallel вернуть вещи в случайном порядке в зависимости от того, какая стратегия используется за кулисами?

1 ответов


В общем, с помощью AsParallel() приведет к неупорядоченности результатов. При этом вы можете явно указать, что вам требуется заказ, добавив вызов метод asordered. Например:

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

некоторые операции обрабатывают заказ автоматически, поэтому это не всегда требуется, но соблюдение порядка замедлит операцию и/или уменьшит количество параллелизма, поэтому обычно это не значение по умолчанию.

для деталей, я рекомендую прочитать сохранение заказа в PLINQ. В этой статье обсуждаются детали того, что сохраняет порядок, а что нет.