我有以下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();
但遗憾的是它无法编译。
答案 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
属性上?无论如何,这都是你要并行化的循环,有效......只是提前一点。