English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Expresiones Lambda LINQ

C#3.0(.NET 3.5)引入了lambda表达式以及 LINQ。lambda表达式是使用某些特殊语法表示匿名方法的一种较短方法。

例如,采用以下匿名方法检查学生是否为青少年:

delegate(Student s) { return s.Age >} 12 && s.Age < 20; };
Dim isStudentTeenAger = Function(s As Student) As Boolean
                                    Return s.Age > 12 And s.Age < 20
                        End Function

Se puede usar la expresión lambda en C# y VB.Net para representar el método anónimo anterior, como se muestra a continuación:

s => s.Age 12 && s.Age < 20
Function(s) s.Age 12 And s.Age < 20

Vamos a ver cómo la expresión lambda se deriva del siguiente método anónimo.

delegate(Student s) { return s.Age >} 12 && s.Age < 20; };

La expresión lambda se derivó de un método anónimo al eliminar la palabra clave de delegado y el tipo de parámetro y agregar el operador de lambda =>.

Expresión lambda proveniente de un método anónimo

La expresión lambda anterior es absolutamente válida, pero si solo hay una instrucción de retorno de valor, no es necesario que los corchetes, return y el punto y coma. Por lo tanto, se puede eliminar.

Además, si solo hay un parámetro, se pueden eliminar los paréntesis ()

Expresión lambda proveniente de un método anónimo

Por lo tanto, hemos obtenido la expresión lambda: s => s.Age > 12 && s.Age < 20 DondesSon los parámetros,=>Es el operador de lambda,s.Age > 12 && s.Age < 20Es el cuerpo de la expresión:

Estructura de la expresión lambda en C#

La forma en que obtenemos la expresión lambda en VB.Net puede escribirse de la siguiente manera:

Estructura de la expresión lambda en VB.Net

La forma de llamar a una expresión lambda es la misma que la de llamar a un delegado con paréntesis

Nota: VB.Net no admite el operador de lambda =>

Expresión lambda con múltiples parámetros

Si necesita pasar múltiples parámetros, puede encerrar los parámetros entre paréntesis, como se muestra a continuación:

    Ejemplo: Especificar múltiples parámetros en una expresión Lambda de C#

(s, youngAge) => s.Age >= youngage;

Si encuentra que la expresión de los parámetros no es clara, también puede proporcionar el tipo de cada parámetro:

(Student s, int youngAge) => s.Age >= youngage;
Ejemplo: Especificar múltiples parámetros en una expresión Lambda de VB.Net
Function(s, youngAge) s.Age >= youngAge

Expresión lambda sin parámetros

No es necesario que una expresión lambda tenga al menos un parámetro. La expresión lambda también puede especificarse sin ningún parámetro.

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

El cuerpo de la expresión Lambda contiene múltiples instrucciones

Si deseas incluir múltiples instrucciones en el cuerpo, puedes encerrar la expresión entre llaves:}

(s, youngAge) =>{
  Console.WriteLine("Expresión Lambda que contiene múltiples instrucciones en el cuerpo");
    
  Return s.Age >= youngAge;}
Function(s, youngAge)
    
    Console.WriteLine("Expresión Lambda que contiene múltiples instrucciones en el cuerpo");
    
    Return s.Age >= youngAge
End Function

Declaración de variables locales en el cuerpo de la expresión Lambda

Puedes declarar una variable en el cuerpo de la expresión para usarla en cualquier lugar del cuerpo de la expresión, como se muestra a continuación:

s =>
{ int youngAge = 18;
    Console.WriteLine("Expresión Lambda que contiene múltiples instrucciones en el cuerpo");
    return s.Age >= youngAge;
}
Function(s) 
                                      
        Dim youngAge As Integer = 18
            
        Console.WriteLine("Expresión Lambda que contiene múltiples instrucciones en el cuerpo");
            
        Return s.Age >= youngAge
            
End Function

Las expresiones Lambda también se pueden asignar a delegados integrados, como Func, Action y Predicate.

Asignación de expresiones Lambda a delegados

Se puede asignar una expresión Lambda a un tipo de delegado Func<in T, out TResult>. El tipo del último parámetro es el tipo de retorno, y los demás son parámetros de entrada.Accede a la sección de delegados Func del tutorial de C# para obtener más información.

Considera la siguiente expresión Lambda para entender si un estudiante es adolescente.

Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20;
Student std = new Student() { age = 21 };
bool isTeen = isStudentTeenAger(std);// Devuelve false
Dim isStudentTeenAger As Func(Of Student, Boolean) = Function(s) s.Age > 12 And s.Age < 20
Dim stud As New Student With {.Age = 21}
Dim isTeen As Boolean = isStudentTeenAger(stud) // devuelve false

En el ejemplo anterior, el delegado Func espera que el primer parámetro de entrada sea del tipo Student y que el tipo de retorno sea booleano. expresión lambda s => s.age > 12 && s.age < 20 cumple con los requisitos del delegado Func<Student, bool>, como se muestra a continuación:

Delegado Func con expresión lambda

El delegado Func <> mostrado anteriormente se convertirá en una función como se muestra a continuación.

bool isStudentTeenAger(Student s)
{
    return s.Age > 12 && s.Age < 20;
}

Delegado Action

A diferencia del delegado Func,Delegado ActionSólo puede tener parámetros de entrada. Utilice el tipo de delegado Action cuando no necesite que la expresión lambda devuelva ningún valor.

Action<Student> PrintStudentDetail = s => Console.WriteLine("Name: {0}, Age: ",1}, s.StudentName, s.Age);
Student std = new Student() { StudentName = "Bill", Age =21};
PrintStudentDetail(std);//Salida: Name: Bill, Age: 21
Dim printStudentDetail As Action(Of Student) = Sub(s) Console.WriteLine("Name: {0}, Age: ",1}, s.StudentName, s.Age)
    
Dim stud As New Student With {.StudentName = "Bill", .Age = 21}
        
printStudentDetail(stud)//Salida: Name: Bill, Age: 21

Expresiones lambda en consultas LINQ

Por lo general, las expresiones lambda se utilizan junto con consultas LINQ. Las clases estáticas enumerables incluyen los métodos de extensión IEnumerable<T> donde se acepta Func<TSource, bool>. Por lo tanto, el método de extensión Where() de IEnumerable<Student> necesita Func<Student, bool>, como se muestra a continuación:

Parámetro de delegado Func en el método de extensión Where

Por lo tanto, ahora, puede usar la sintaxis de método Where() como se muestra a continuación para pasar una expresión lambda asignada a un delegado de tipo Func a un método de extensión:

IList<Student> studentList = new List<Student>{...};
Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20;
var teenStudents = studentList.Where(isStudentTeenAger).ToList<Student>();
IList<Student> studentList = new List<Student>{...};
Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20;
var teenStudents = from s in studentList
                   where isStudentTeenAger(s)
                   select s;

Puede seguir el mismo método en VB.Net para pasar delegados de tipo Func.

Puntos a recordar

  1. La expresión Lambda es una abreviatura para métodos de métodos anónimos.

  2. Sintaxis de expresión Lambda: Parámetro => cuerpo de expresión

  3. Las expresiones Lambda pueden tener cero parámetros.

  4. Los paréntesis () de la expresión Lambda pueden tener múltiples parámetros.

  5. Las expresiones Lambda pueden contener múltiples instrucciones en el cuerpo entre llaves {}.

  6. Las expresiones Lambda se pueden asignar a delegados de tipo Func, Action o Predicate.

  7. Se puede invocar Lambda Expression de manera similar a una delegación.