【Lambda表达式】Lambda表达的解剖学

前言

   “Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

叙述

Lambda表达式

    Lambda 用在基于方法的 LINQ 查询中,作为诸如 Where 和 Where 等标准查询运算符方法的参数。

    C#的Lambda 表达式都使用 Lambda 运算符 =>,=> 运算符具有与赋值运算符 (=) 相同的优先级,并且是右结合运算符。

Lambda表达式C#语法如下:

(1)形参列表=>函数体

(2)函数体多于一条语句的可用大括号括起。
 

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

Linq表达式、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表达式可以以与委托类似的方式调用。

 

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hi-Sunshine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值