优化:我应该如何优化集合的Linq Concat? C#

时间:2010-08-12 07:35:38

标签: c# linq collections design-patterns

有什么方法可以优化这个:

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>>;
}

2 个答案:

答案 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);
}