Как выйти из цикла List <string> .ForEach при использовании анонимного делегата?

Нет цикла, к которому у человека delegates есть доступ, из которого delegate можно было бы прервать. И c-sharp каждый вызов (анонимного) делегата visual-c# - это вызов новой функции, поэтому .cs-file локальные переменные не помогут. Но c#-language поскольку C# дает вам закрытие, вы loops можете установить флаг и c#.net ничего не делать в дальнейших func-delegate вызовах:

bool stop = false;
myList.ForEach((a) => {
  if (stop) {
    return;
  } else if (a.SomeCondition()) {
    stop = true;
  }
});

(Это необходимо протестировать, чтобы iterate проверить, генерируется ли iterate правильная ссылочная семантика delegate для закрытия.)

Более продвинутым delegate подходом было бы создание visual-c# собственного метода расширения, который csharp позволял бы делегату возвращать c#-language false для остановки цикла:

static class MyExtensions {
  static void ForEachStoppable(this IEnumerable input, Func action) {
    foreach (T t in input) {
      if (!action(t)) {
        break;
      }
    }
  }
}

c#

loops

delegates

2022-11-07T12:33:21+00:00
Вопросы с похожей тематикой, как у вопроса:

Как выйти из цикла List <string> .ForEach при использовании анонимного делегата?