Expresiones Lambda en C#

1 - Qué es una expresión lambda (Lambda expression)

Como vimos en el post de los delegados las lambda expresion son otra forma de representar métodos anónimos utilizando una sintaxis especial.

Aquí podemos ver un ejemplo de un método anónimo el cual comprueba si es mayor de edad:

delegate(int edad) { return edad >= 18 };

El mismo código se puede representar utilizando una Lambda expression de la siguiente manera

edad => edad >= 18;

Como vemos el código ha cambiado un poco y vamos a explicarlo. 

  1. Hemos quitado la palabra clave delegado y el tipo de parámetro que recibe la función (el delegado en este caso).
  2. Incluimos el operador lambda => para indicar que es una Lambda expression. Debemos incluirlo entre el parámetro de entrada y el cuerpo de la función.
  3. Finalmente el compilador es suficientemente inteligente para detectar que no hacen falta paréntesis o corchetes, con lo que los podemos quitar. 

1.1 - Múltiples parámetros en una Lambda Expression

Las Lambda expression nos otorgan la posibilidad de incluir múltiples parámetros si los incluimos entre paréntesis:

(edad, limiteEdad) => edad >= 18 && edad <= limiteEdad;

1.2 - Lambda expression sin parámetros

Las lambda expression tambien nos otorgan la posibilidad de no incluir parámetros. Para ello debemos incluir paréntesis vacíos a la hora de llamar a la expresión. 

() => Console.WriteLine("Expresión Lambda sin parámetros");

1.3 - Lambda expression con body

Finalmente se nos otorga la oportunidad de incluir un cuerpo mayor que una sola línea, para ello lo que debemos hacer es incluir dos llaves, una para abrir y otra para cerrar { ///Codigo }

edad => {
    Console.WriteLine("comprobando la edad");
    int edadMinima = 18;
    return edad >= edadMinima;
}

Como podemos observar tenemos la opción de declarar variables dentro del body de una lambda expression.

 

2 - Uso de expresiones lambda en delegados

Una expresión lambda puede ser asignada a los delegados que vimos en el post de los delegados, Func<in T, out TResult>, Action<T> , Predicate<in T>

Func<int, bool> mayorDeEdad = edad => edad >= 18;
Persona p = new Persona(){ Nombre = "Ivan", Edad = 27 };
bool esMayorDeEdad = mayorDeEdad(p.Edad); //return true

Observamos que también podemos llamarlo como a un método. 

 

3 - Uso de expresiones lambda en LINQ

El caso más común de uso de expresiones lambda es dentro de consultas LINQ. el cual es un lenguaje de consultas sobre objetos dentro de C#. veremos un módulo específico para ello así que no entraré más en detalle. Dejare el link aquí cuando escriba dicho post. 

Por ahora únicamente nos interesa saber que LINQ contiene un extension method gracias a que implementa la interfaz IEnumerable<T> el cual se denomina .Where(), que acepta el delegado Func<T, bool>, el cual siginifica que devolverá verdadero o falso en función de lo que pasemos como predicado. 

List<Persona> personas = new List<Persona>() { ... }
Func<int, bool> mayorDeEdad = edad => edad >= 18;
List<Persona> mayoresDeEdad = personas.Where( a=> mayorDeEdad(a.Edad));

Al Ejecutar el código podemos observar cómo filtra todas las personas que no son mayores de edad. 

 

Conclusion

  • Entender y estar acostumbrados a utilizar expresiones lambda es primordial, ya que son utilizadas continuamente en nuestro día a día laboral.
  • el operador => ejecuta la expresión, no asigna valor. 
  • La sintaxis será parámetros => cuerpo de la función.
  • Una expresión lambda puede tener múltiples parámetros, o ninguno.
  • Una expresión lambda puede ser asignada a los delegados Func, Action y Predicate.