English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 =>.
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 ()
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:
La forma en que obtenemos la expresión lambda en VB.Net puede escribirse de la siguiente manera:
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 =>
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
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")
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
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.
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:
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; }
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
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:
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.
La expresión Lambda es una abreviatura para métodos de métodos anónimos.
Sintaxis de expresión Lambda: Parámetro => cuerpo de expresión
Las expresiones Lambda pueden tener cero parámetros.
Los paréntesis () de la expresión Lambda pueden tener múltiples parámetros.
Las expresiones Lambda pueden contener múltiples instrucciones en el cuerpo entre llaves {}.
Las expresiones Lambda se pueden asignar a delegados de tipo Func, Action o Predicate.
Se puede invocar Lambda Expression de manera similar a una delegación.