前言
“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。
叙述
Lambda表达式
Lambda 用在基于方法的 LINQ 查询中,作为诸如 Where 和 Where 等标准查询运算符方法的参数。
C#的Lambda 表达式都使用 Lambda 运算符 =>,=> 运算符具有与赋值运算符 (=) 相同的优先级,并且是右结合运算符。
Lambda表达式C#语法如下:
(1)形参列表=>函数体
Lambda表达式和匿名方法
Lambda表达式是使用一些特殊语法表示匿名方法的一种较短的方式。
例如,匿名方法检查学生是否是十几岁的学生:
匿名方法
delegate(Student s) { return s.Age > 12 && s.Age < 20; };
上面的匿名方法可以使用C#中的Lambda表达式来表示,如下所示:
在C#中的Lambda表达式
s => s.Age > 12 && s.Age < 20
Lambda表达式从匿名方法发展而来,首先删除委托关键字和参数类型,并添加一个lambda运算符=>。
如果只有一个参数,我们可以删除括号()。
因此,我们得到了lambda表达式:s => s.Age > 12 && s.Age < 20 其中s是参数,=>是lambda运算符,s.Age > 12 && s.Age < 20是正文表达式:
Lambda表达式例子
(1)具有多个参数的Lambda表达式:
如果您需要传递多个参数,可以将参数放在括号中,如下所示:
示例:在lambda表达式中指定多个参数C#
(s, youngAge) => s.Age >= youngage;
在lambda表达式中指定参数类型C#
(Student s,int youngAge) => s.Age >= youngage;
(2)没有任何参数的Lambd表达式:
在lambda表达式中不需要至少一个参数。lambda表达式可以在没有任何参数的情况下被指定。
带零参数的Lambda表达式。
() => Console.WriteLine("Parameter less lambda expression")
(3)正文表达中的多个语句:
如果要在正文中使用多个语句,则可以使用大括号包装表达式:
(s, youngAge) =>
{
Console.WriteLine("Lambda expression with multiple statements in the body");
Return s.Age >= youngAge;
}
(4)Lambda表达式主体中的局部变量:
您可以在表达式主体中声明一个变量,以在表达式主体中的任何位置使用它,如下所示:
s =>
{
int youngAge = 18;
Console.WriteLine("Lambda expression with multiple statements in the body");
return s.Age >= youngAge;
}
(5)功能代表:
当你想从lambda表达式返回某些东西的时候,使用Func <>委托。Func <>委托中的最后一个参数类型是返回类型,rest是输入参数。
考虑下面的lambda表达式来找出一个学生是否是一个十几岁的孩子。
分配给C#中的Func委托的Lambda表达式
Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20;
Student std = new Student() { age = 21 };
bool isTeen = isStudentTeenAger(std);// returns false
在上面的例子中,Func委托期望第一个输入参数是Student类型,返回类型是boolean。lambda表达式 s => s.age > 12 && s.age < 20满足Func <Student,bool>委托要求,如下所示:
上面显示的Func <>委托会变成如下所示的函数。
bool isStudentTeenAger(Student s)
{
return s.Age > 12 && s.Age < 20;
}
(6)行动代表:
与Func委托不同,一个Action委托只能有输入参数。当您不需要从lambda表达式返回任何值时,使用Action委托类型。
分配给C#中的Action委托的Lamda表达式
Action<Student> PrintStudentDetail = s => Console.WriteLine("Name: {0}, Age: {1} ", s.StudentName, s.Age);
Student std = new Student(){ StudentName = "Bill", Age=21};
PrintStudentDetail(std);//output: Name: Bill, Age: 21
(7)LINQ查询中的Lambda表达式:
通常,lambda表达式与LINQ查询一起使用。枚举静态类包括其中扩展方法IEnumerable<T>接受Func<TSource,bool>。所以IEnumerable<Student>需要通过Where()扩展方法来传递Func<Student,bool>,如下所示:
所以,现在,您可以将分配给Func委托的lambda表达式传递给方法语法中的Where()扩展方法,如下所示:
LINQ方法语法中的Func委托
IList<Student> studentList = new List<Student>(){...};
Func<Student, bool> isStudentTeenAger = s => s.age > 12 && s.age < 20;
var teenStudents = studentList.Where(isStudentTeenAger).ToList<Student>();
例如:LINQ查询语法中的Func委托
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;
Linq VS Lambda
实际项目中的应用
/// <summary>
///根据UserState获取所有的学生状态-是在校或者是实习
/// </summary>
/// <returns></returns>
public List<t_states> GetAllStates(string userState)
{
List<t_states> listStates = new List<t_states>();
//Linq语句
listStates = (from s in dbcontext.t_states
where s.userSates == userState
select s).ToList();
//Lambda表达式
// listStates = dbcontext.t_states.Where(s => s.userSates == userState).ToList();
return listStates;
}
小结
1、Lambda表达式是表示匿名方法的一种较短的方式。
2、Lambda表达式语法: parameters => body expression
3、Lambda表达式可以有零参数。
4、Lambda表达式可以在括号()中有多个参数。
5、Lambda Expression可以在大括号{}中的正文表达式中包含多个语句。
6、可以将Lambda表达式分配给Func,Action或Predicate委托。
7、Lambda表达式可以以与委托类似的方式调用。