使用Let,Select Keywords来并行化LINQ查询

时间:2010-08-07 08:57:32

标签: c# plinq

我有以下LINQ查询

  var meshesList= (
            from element in elementCoord.Elements
                let coordinateList = elementCoord.Coordinates
                select new Plane3D
                           {
                               Pt1 = coordinateList[element.NodeList[0]], Pt2 = coordinateList[element.NodeList[1]], Pt3 = coordinateList[element.NodeList[2]]
                           }

                    into meshPlan
                    let algo = new AlgoProvider()
                    where WellBehaveMesh(meshPlan)
                    select algo.ComputeVolume(meshPlan, platformPlan)).ToList();

from直到into meshPlan将选择meshPlan的列表。这是我认为并行化可以利用的一部分。

关于如何使用PLINQ并行化上述操作的任何想法?

我尝试过以下操作:

  var meshesList= (
            (from element in elementCoord.Elements
                let coordinateList = elementCoord.Coordinates
                select new Plane3D
                           {
                               Pt1 = coordinateList[element.NodeList[0]], Pt2 = coordinateList[element.NodeList[1]], Pt3 = coordinateList[element.NodeList[2]]
                           }

                    into meshPlan).AsParallel()  //cannot compile
                    let algo = new AlgoProvider()
                    where WellBehaveMesh(meshPlan)
                    select algo.ComputeVolume(meshPlan, platformPlan)).ToList();

但遗憾的是它无法编译。

1 个答案:

答案 0 :(得分:2)

最简单的方法是将其分解为两个查询表达式:

var meshPlans = from element in elementCoord.Elements
                let coordinateList = elementCoord.Coordinates
                select new Plane3D
                {
                    Pt1 = coordinateList[element.NodeList[0]], 
                    Pt2 = coordinateList[element.NodeList[1]],
                    Pt3 = coordinateList[element.NodeList[2]]
                };

var meshesList = (from meshPlan in meshPlans.AsParallel()
                 let algo = new AlgoProvider()
                 where WellBehaveMesh(meshPlan)
                 select algo.ComputeVolume(meshPlan, platformPlan)).ToList();

考虑到查询表达式(和let)的工作方式,我不确定你是否可以在一个查询表达式中完全按照你想要的那样做。

另一方面,您是否尝试过将AsParallel()放在第一个elementCoord.Elements属性上?无论如何,这都是你要并行化的循环,有效......只是提前一点。