微软专门为Linq拓展了一个类ParallelEnumerable(该类型也在命名空间System.Linq中),它所提供的扩展方法让Linq支持并行计算,这就是所谓PLinq。
传统的Linq计算是单线程的,PLinq则是并发的、多线程的,例如:
class Program
{
static void Main(string[] args)
{
List<int> intList = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var query = from p in intList select p;
Console.WriteLine("以下是Linq输出:");
foreach (int item in query)
{
Console.WriteLine(item.ToString());
}
Console.WriteLine("以下是PLinq并行输出:");
var queryParallel = from p in intList.AsParallel() select p;
foreach (int item in queryParallel)
{
Console.WriteLine(item.ToString());
}
Console.ReadKey();
}
}
以下是Linq输出:
0
1
2
3
4
5
6
7
8
9
以下是PLinq并行输出:
0
1
9
2
4
6
8
3
5
7
并行输出的另一种方式:
queryParallel.ForAll((item) => {
Console.WriteLine(item.ToString());
});
使用ForAll会忽略掉查询的AsOrdered请求。例:
Console.WriteLine("以下是PLinq并行顺序输出:");
var queryParallel = from p in intList.AsParallel().AsOrdered() select p;
foreach (int item in queryParallel)
{
Console.WriteLine(item.ToString());
}
Console.WriteLine("以下是PLinq并行ForAll输出:");
queryParallel.ForAll((item) => {
Console.WriteLine(item.ToString());
});
以下是PLinq并行顺序输出:
0
1
2
3
4
5
6
7
8
9
以下是PLinq并行ForAll输出:
9
2
3
8
4
5
6
7
0
1
在并行查询后在进行排序,会牺牲掉一定的性能。一些扩展方法默认对元素进行排序,这些方法包括OrderBy、OrderByDescending、ThenBy和ThenByDescending,还有一些查询方法比如Take。