Оптимизация: Как мне оптимизировать Linq Concat коллекций?C # - PullRequest
3 голосов
/ 12 августа 2010

Есть ли способ, которым я могу оптимизировать это:

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 ]

2 голосов
/ 12 августа 2010

Если вы ищете каждую комбинацию, используйте вместо нее 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 голос
/ 12 августа 2010

Нет смысла делать запрос параллельным в самом конце. Обновление: Джон был прав, мое первоначальное решение было неверным и оказалось, что мое исправленное решение было практически таким же, как его.

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...