Абсолютно.В первом случае проекция и фильтрация будут выполняться последовательно, и только , тогда будет что-либо распараллелено.
Во втором случае проекция и фильтрация будут выполняться параллельно.
Если у вас нет особых причин использовать первую версию (например, проекция имеет сходство с потоками или какая-то другая странность), вам следует использовать вторую.
РЕДАКТИРОВАТЬ: Вот некоторый тестовый код.Как и многие тесты, есть недостатки, но результаты достаточно убедительны:
using System;
using System.Diagnostics;
using System.Linq;
using System.Threading;
class Test
{
static void Main()
{
var query = Enumerable.Range(0, 1000)
.Select(SlowProjection)
.Where(x => x > 10)
.AsParallel();
Stopwatch sw = Stopwatch.StartNew();
int count = query.Count();
sw.Stop();
Console.WriteLine("Count: {0} in {1}ms", count,
sw.ElapsedMilliseconds);
query = Enumerable.Range(0, 1000)
.AsParallel()
.Select(SlowProjection)
.Where(x => x > 10);
sw = Stopwatch.StartNew();
count = query.Count();
sw.Stop();
Console.WriteLine("Count: {0} in {1}ms", count,
sw.ElapsedMilliseconds);
}
static int SlowProjection(int input)
{
Thread.Sleep(100);
return input;
}
}
Результаты:
Count: 989 in 100183ms
Count: 989 in 13626ms
Сейчас в PFX происходит много эвристических вещей, но совершенно очевидно, чтопервый результат вообще не был распараллелен , а второй -