改善C#程序的157个建议——建议84学习笔记:使用PLINQ

微软专门为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。



上一篇:程序员必知的10大基础实用性算法


下一篇:重新想象 Windows 8 Store Apps (50) - 输入: 边缘手势, 手势操作, 手势识别