LINQ学习篇(4) -- Lambda表达式的一些知识

为什么添加 Lambda 表达式?
为了支持 LINQ 查询,需要添加一些功能,其中包括 Visual Basic 和 lambda 表达式。假设您在 Visual Basic 中使用以下查询语句:
  1. Dim q = From p In Process.GetProcesses() _
  2.         Where p.PriorityClass = ProcessPriorityClass.High _
  3.         Select p
为了编译这一查询语句,实际需要进行大量的幕后工作。从高层次来说,编译器会循环遍历 Process.GetProcesses 集合,对其应用 Where 筛选,并返回一个与 Where 子句的筛选相匹配的进程列表。
请注意,在 Where 子句中有一个 Visual Basic 表达式:p.PriorityClass = ProcessPriorityClass.High.为了执行此筛选,编译器为 Where 筛选创建一个 lambda 表达式,且将其应用于进程列表中的每个元素:
  1. Dim q = Process.GetProcesses().Where( _
  2.             Function(p) p.PriorityClass = ProcessPriorityClass.High)
实质上,lambda 表达式为编译器简化了生成方法并将其分配给委托的过程;所有这一切都已为您完成。您无法从委托/函数组合中获得,但却从 lambda 表达式中获得的益处就是,编译器对 lambda 参数执行自动类型推断。在上面的示例中,参数 p 的类型通过这种用法来推断;在这种情况下,Where 参数定义了 lambda 表达式类型,而编译器推断出参数 lambda 表达式的类型。编译器支持的类型推断功能是对 Visual Basic 新增的强大功能。让我们来了解一下它们可以为您做些什么。
 
充分利用 Lambda 表达式
在 Visual Basic 2008 中,您只能提供一个表达式作为 lambda 的主体,但是最新引入的三元关键字允许您使用简单、具备完全类型化的条件表达式:
  1. Dim x = If(condition, 10, 20)
If 关键字与 IIF 函数调用类似,唯一不同是 If 关键字是完全类型化安全的。这意味着,在上面的示例中,编译器推断 If 关键字的两个分支返回一个整数,因此它应用类型推断规则确定 x 的类型是 Integer。使用 IIF,x 将会是类型对象。
在 lambda 表达式中可以使用 If 关键字:
  1. Dim x = Function(c As Customer) _
  2.     If(c.Age >= 18, c.Address, c.Parent.Address)
在此例中,假定有一个 Customer 类,如您所料,其定义包括代表了客户当前地址的 Address 属性。lambda 表达式使用三元表达式将某个条件应用于输入参数;如果客户是 18 岁或以上,则返回其地址。否则,返回其父母的地址。
这时类型推断介入,且编译器确定 lambda 表达式的返回类型为 Address。然后,它为 x 创建委托类型(如之前讨论),该委托类型接受 Customer 作为输入并返回 Address。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值