Ответ 1
Совершенно верно. В первом случае проекция и фильтрация будут выполняться последовательно, и только тогда все будет распараллеливаться.
Во втором случае проекция и фильтрация будут выполняться параллельно.
Если у вас нет конкретной причины использовать первую версию (например, проекция имеет сродство нити или какую-либо другую нечетность), вы должны использовать вторую.
ИЗМЕНИТЬ: Вот какой тестовый код. Недостатки, как и многие тесты, но результаты являются достаточно убедительными:
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 много эвристического материала, но довольно очевидно, что первый результат не был распараллелен вообще, тогда как второй имеет.