有什么方法可以优化这个:
public static IEnumerable<IEnumerable<int>> GenerateCombinedPatterns
(IEnumerable<IEnumerable<int>> patterns1,
IEnumerable<IEnumerable<int>> patterns2)
{
return patterns1
.Join(patterns2, p1key => 1, p2key => 1, (p1, p2) => p1.Concat(p2))
.Where(r => r.Sum() <= stockLen)
.AsParallel()
as IEnumerable<IEnumerable<int>>;
}
答案 0 :(得分:2)
如果您正在寻找所有组合,请改用SelectMany
,通常使用多个“from”子句执行:
return from p1 in patterns1
from p2 in patterns2
let combination = p1.Concat(p2)
where combination.Sum() <= stockLen
select combination;
虽然没有任何并行性......但根据预期的集合,我可能只是在一个级别进行并行化,例如
return from p1 in patterns1.AsParallel()
from p2 in patterns2
let combination = p1.Concat(p2)
where combination.Sum() <= stockLen
select combination;
请注意,不能保证上述结果的顺序 - 如果您想要原始订购,则需要调整它。
答案 1 :(得分:1)
在最后使查询并行是没有意义的。 更新: Jon是对的,我的初步解决方案是错误的,结果我的纠正解决方案基本上与他的相同。
public static IEnumerable<IEnumerable<int>> GenerateCombinedPatterns
(IEnumerable<IEnumerable<int>> patterns1,
IEnumerable<IEnumerable<int>> patterns2)
{
var parallel1 = patterns1.AsParallel();
return parallel1.SelectMany(p1 => patterns2.Select(p2 => p1.Concat(p2)))
.Where(r => r.Sum() <= stockLen);
}