Cómo dejar el cuerpo de una expresión lambda

Tengo una lista y lo hago list.ForEach( l => { ... something ...}). Ahora, con cierta condición, necesito dejar de iterar sobre la lista, pero break no funciona - obtengo "Control cannot leave the body of an anonymous method or lambda expression" error de compilación.

¿Alguna idea de cómo superar esa restricción?

preguntado el 30 de enero de 12 a las 20:01

3 Respuestas

Usar break solo no funcionará aquí porque la lambda se ejecuta en un método diferente que el bucle for. A break La declaración solo es útil para romper construcciones locales a la función actual.

Para admitir un estilo de descanso, debe agregar una sobrecarga de ForEach donde el delegado puede especificar mediante un valor de retorno que la ejecución del ciclo debe interrumpirse. Por ejemplo

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

Ahora un consumidor de esto ForEach El método puede especificar un break volviendo false de la devolución de llamada proporcionada

myCollection.ForEach(current => {
  if (someCondition) {
    // Need to break
    return false;
  }
  // Keep going
  return true;
}

Respondido el 31 de enero de 12 a las 00:01

Una expresión lambda funciona como un método.
Puede return cuando quieras.

Sin embargo, List.ForEach no ofrece ninguna forma de detener prematuramente la iteración.
Si necesitas break, solo usa un normal foreach lazo.

Respondido el 31 de enero de 12 a las 00:01

¿Y qué harías en leu de continue si necesita omitir condicionalmente una iteración, tampoco funciona. - Andrey

Tendría que la lambda devolviera un booleano dentro de su bucle y, si devolviera falso, se rompería. - Erik Dietrich

"Necesito dejar de iterar sobre la lista, pero la pausa no funciona" - esto no responde a la pregunta - Vidrio roto

@Porges: tienes razón, acabo de marcar y devuelvo igual para continuar en este caso. Todavía estoy tratando de averiguar cómo dejar el bucle condicionalmente. - Andrey

Sí, lo veo ahora :) ¡Gracias! - Andrey

No puede detener la iteración desde dentro de un ForEach lambda ya que no tiene control del bucle externo que llama al lambda. En ese momento, ¿por qué no usa un foreach bucle y un break declaración - que sería mucho más legible para este caso.

Respondido el 31 de enero de 12 a las 00:01

La única razón por la que uso lambda es porque me gusta usar lambda, y esa es la única razón por la que se agregó a C #: conveniencia. Tiene razón: si no funciona para un caso determinado, usaré foreach o lo que sea aplicable; Solo tengo curiosidad por saber si hay alguna manera de seguir utilizándolo. Eso es, solo una mente curiosa :) - Andrey

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.