Как выйти из тела лямбда-выражения - PullRequest
7 голосов
/ 31 января 2012

У меня есть список, и я делаю list.ForEach( l => { ... something ...}). Теперь при определенных условиях мне нужно прекратить итерации по списку, но break не работает - я получаю ошибку компиляции "Control cannot leave the body of an anonymous method or lambda expression".

Есть идеи, как преодолеть это ограничение?

Ответы [ 3 ]

10 голосов
/ 31 января 2012

Использование только break здесь не сработает, потому что лямбда-функции выполняются не так, как цикл for.Оператор break полезен только для разрыва конструкций, локальных для текущей функции.

Чтобы поддерживать отпуск в стиле прерывания, вам нужно добавить перегрузку ForEach, когда делегат может указать через возвращаемое значение, что выполнение цикла должно прерываться.Например,

public static void ForEach<T>(this IEnumerable<T> enumerable, Func<T, bool> func) {
  foreach (var cur in enumerable) {
    if (!func(cur)) {
      break;
    }
  }
}

Теперь потребитель этого метода ForEach может указать break, возвращая false из предоставленного обратного вызова

myCollection.ForEach(current => {
  if (someCondition) {
    // Need to break
    return false;
  }
  // Keep going
  return true;
}
6 голосов
/ 31 января 2012

Лямбда-выражение работает так же, как метод.
Может return в любое время.

Однако List.ForEach не предлагает способа преждевременной остановки итерации.
Есливам нужно break, вы просто используете обычный цикл foreach.

1 голос
/ 31 января 2012

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

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