Эмулировать оператор break в функции ForEach - PullRequest
3 голосов
/ 01 марта 2010

Это скорее гипотетический вопрос, так как я все больше использую .NET 3.5 вместе с лямбда-выражениями и анонимными делегатами. Возьмите этот простой пример:

static void Main(string[] args)
{
   List<int> numList = new List<int>(int[] { 1, 3, 5, 7, 9, 11, 12, 13, 15 });

   numList.ForEach(i =>
   {
       if (i % 2 == 1)
           Console.Write(i);
       else
           return;
   });

   Console.ReadLine();
}

Это даст результат:

13579111315

Конечно, что я действительно хотел бы сделать, это прекратить выполнение функции ForEach после 12, а не печатать 13 или 15. В традиционной конструкции foreach у вас будет разрыв (вместо возврата в моем пример), и цикл закончится. Однако перерыв в этом случае незаконен. Вы получите следующее сообщение:

Нет замкнутого контура, из которого можно разорвать или продолжить

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

1 Ответ

3 голосов
/ 01 марта 2010

Просто используйте стандартную петлю foreach. Это почти всегда проще и менее запутанно, чем использование лямбда-выражения - вы не путаетесь с захваченными переменными и т. Д.

Вы также можете прочитать пост Эрика Липперта на эту тему .

List<T>.ForEach полезно, если вы получили делегата и хотите просто выполнить его для каждого элемента в списке, но в противном случае я бы придерживался функции обычного языка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...