Есть ли эквивалент «продолжить» в Parallel.ForEach?

249

Я портирую некоторый код Parallel.ForEachи получил ошибку с кодом, который у continueменя есть. Есть ли что-то эквивалентное, что я могу использовать в Parallel.ForEachфункционально эквивалентном continueв foreachцикле?

Parallel.ForEach(items, parallelOptions, item =>
{
    if (!isTrue)
        continue;
});
Джон Эгберт
источник

Ответы:

414
return;

(тело - это просто функция, вызываемая для каждого элемента)

Дейв
источник
23

Когда вы преобразовали свой цикл в совместимое определение для логики Parallel.Foreach, вы в конечном итоге сделали тело оператора лямбда-выражением. Ну, это действие, которое вызывается функцией Parallel.

Таким образом, заменить continueна return, и порвать с Stop()или Break()заявления.

Таран
источник
1
Возможно, лучшим вариантом, чем замена разрывов на операторы возврата, являются ParallelLoopState's Stop () и Break (). blogs.msdn.com/b/pfxteam/archive/2009/05/27/9645023.aspx
JasonCoder
@JasonCoder ни один из них не эквивалентен, continueхотя.
будет
1
@ Верно, поэтому я сказал перерывы. операторы return заменяют операторы
continue
@JasonCoder - Ах. Я неправильно понял, что вы имели в виду, упс.
будет
-1

Продолжить это значит пропустить оставшуюся часть блока и перейти к следующему пункту. Таким образом, вы можете реализовать продолжить, применив противоположное условие к остальной части блока.

Например, код в вопросе будет переписан как:

Parallel.ForEach(items, parallelOptions, item =>
{
    //Skip an item by applying the opposite condition used for continue on all items until the end of the foreach

    if (isTrue) 
    {
      //Do what you want to do for all items
    }

});
Шади Намроути
источник