Нет петли, к которой можно получить доступ, из которой можно выйти. И каждый вызов (анонимного) делегата является новым вызовом функции, поэтому локальные переменные не помогут. Но так как C # дает вам закрытие, вы можете установить флаг, а затем ничего не делать в следующих вызовах:
bool stop = false;
myList.ForEach((a) => {
if (stop) {
return;
} else if (a.SomeCondition()) {
stop = true;
}
});
(Это необходимо проверить, чтобы проверить, генерируется ли правильная ссылочная семантика для замыкания.)
Более продвинутым подходом было бы создание собственного метода расширения, позволяющего делегату возвращать false, чтобы остановить цикл:
static class MyExtensions {
static void ForEachStoppable<T>(this IEnumerable<T> input, Func<T, bool> action) {
foreach (T t in input) {
if (!action(t)) {
break;
}
}
}
}