0

我有以下 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();

fromuntil将into meshPlan选择一个meshPlans 列表。这是我相信并行化可以利用的部分。

关于如何使用 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();

但遗憾的是它无法编译。

4

1 回答 1

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();

鉴于查询表达式 (and let) 的工作方式,我不确定您是否可以完全在单个查询表达式中完成您想要的操作。

另一方面,您是否尝试过仅放置AsParallel()第一个elementCoord.Elements属性?无论如何,这与您将要并行化的循环相同,有效...只是稍早一点。

于 2010-08-07T09:02:56.440 回答