Как я могу использовать оператор continue в методе .ForEach () - PullRequest
21 голосов
/ 01 декабря 2011

Есть ли эквивалент для оператора continue в методе ForEach?

List<string> lst = GetIdList();
lst.ForEach(id =>
{
     try
     {
       var article = GetArticle(id);
       if (article.author.contains("Twain"))
       {
         //want to jump out of the foreach now
         //continue; **************this is what i want to do*******

       }

       //other code follows
   }

EDIT: Спасибо за все отличные ответы.И спасибо за разъяснение, что .foreach не является методом расширения.Я использую эту структуру для обеспечения согласованности стиля кодирования (другой программист работал над другим подобным методом в том же классе) ... и спасибо за ссылки на то, почему следует избегать использования .foreach.

Ответы [ 6 ]

52 голосов
/ 01 декабря 2011

A) ForEach - это не LINQ, это метод для List<T>.
B) Просто используйте foreach.
C) return сделает это.

Редактировать

Просто, чтобы уточнить, что вы делаете, это предоставление метода, который будет вызываться для каждой записи в списке.return будет применяться только к методу для этого члена.Остальные члены в списке по-прежнему будут вызывать метод.

18 голосов
/ 01 декабря 2011

Лично я бы просто использовал стандартный цикл foreach вместо List<T>.ForEach.

В этом случае вы можете инвертировать условие (чтобы избежать кода в этом случае) или вызвать return, так какВаша цель - использовать оператор continue.Однако, если вы хотите break, это не будет работать.При этом, существует несколько других причин, по которым следует избегать List<T>.ForEach, поэтому я хотел бы рассмотреть возможность переключения на обычный оператор foreach.

10 голосов
/ 01 декабря 2011

Просто измените ваше if условие:

lst.ForEach(id => {
                      var article = GetArticle(id);
                      if (!article.author.contains("Twain"))
                      {
                          // other code here
                      }
                  });
3 голосов
/ 01 декабря 2011

Используемый вами метод - List<T>.ForEach, метод, определенный в классе, а не метод расширения LINQ. Этот вопрос на самом деле не имеет ничего общего с LINQ.

return; в делегате, переданном в List<T>.ForEach, должно приблизительно соответствовать continue; в фактической конструкции foreach.

2 голосов
/ 10 мая 2017

Чтобы ответить на ваш вопрос:

List<string> lst = GetIdList();
lst.ForEach(id =>
{
    try
    {
        var article = GetArticle(id);
        if (article.author.contains("Twain"))
            goto _continue;
    }

    //other code follows

    _continue:;
}

Остальные ответы правильные, избегайте также .ForEach().
goto, хотя иногда это полезно для сокращения блоков кода.

1 голос
/ 01 декабря 2011

Continue в foreach будет возвращаться к началу цикла и переходить к следующему элементу в последовательности. Если это то, что вы хотите, возвращение должно сделать это. Если вы хотите выйти полностью, вы можете переписать его, используя реальный метод LINQ, такой как Any ().

...