Lambda 表达式
"Lambda 表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda 简化
了开发中需要编写的代码量。它可以包含表达式和语句,并且可用于创建委托或表达式目录
树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。所有 Lambda 表达式
都使用 Lambda 运算符=>,该运算符读作"goes to"。Lambda 运算符的左边是输入参数(如果
有),右边是表达式或语句块。Lambda 表达式 x => x * x 读作"x goes to x times x"。可以将此
表达式分配给委托类型,如下所示:
delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
Lambda 表达式 Lambda 表达式是由.NET 2.0 演化而来的,也是 LINQ 的基础,熟练地掌握
Lambda 表达式能够快速地上手 LINQ 应用开发。
Lambda 表达式在一定程度上就是匿名方法的另一种表现形式。为了方便对 Lambda 表达式
的解释,首先需要创建一个 People 类,示例代码如下。
public class People
{
public int age { get; set; }
public string name { get; set; }
public People(int age,string name)
{
//设置属性
//设置属性
//设置属性(构造函数构造)
this.age = age;
this.name = name;
//初始化属性值 age
//初始化属性值 name
}
}
上述代码定义了一个 People 类,并包含一个默认的构造函数能够为 People 对象进行年龄和
名字的初始化。在应用程序设计中,很多情况下需要创建对象的集合,创建对象的集合有利
于对对象进行搜索操作和排序等操作,以便在集合中筛选相应的对象。使用 List 进行泛型编
程,可以创建一个对象的集合,示例代码如下。
//创建泛型对象
//创建一个对象
//创建一个对象
//创建一个对象
//创建一个对象
List
people = new List();
People p1 = new People(21,"guojing");
People p2 = new People(21, "wujunmin");
People p3 = new People(20, "muqing");
People p4 = new People(23, "lupan");
people.Add(p1);
people.Add(p2);
people.Add(p3);
people.Add(p4);
上述代码创建了 4 个对象,这 4 个对象分别初始化了年龄和名字,并添加到 List 列表中。当
应用程序需要对列表中的对象进行筛选时,例如需要筛选年龄大于 20 岁的人,就需要从列
表中筛选,示例代码如下。
//添加一个对象
//添加一个对象
//添加一个对象
//添加一个对象
因为编译器能够根据上下文直接推断参数的类型,示例代码如下。
(x, y) => x + y
Lambda 表达式的主体可以是表达式也可以是语句块,这样就节约了代码的编写。
//多参数,隐式类型=> 表达式
【例 2-5】传统方法,匿名方法和 Lamdba 表达式对比。
(1) 创建控制台应用程序 LamdbaPrictice。
(2) 在程序中添加 3 个函数,这 3 个函数分别使用传统的委托调用、使用匿名方法和 Lamdba
表达式方法完成同一功能,对比有什么不同。代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LambdaDemo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("传统的委托代码示例:");
FindListDelegate();
Console.Write("\n");
Console.WriteLine("使用匿名方法的示例:");
FindListAnonymousMethod();
Console.Write("\n");
Console.WriteLine("使用 Lambda 的示例:");
FindListLambdaExpression();
}
//传统的调用委托的示例
static void FindListDelegate()
{
//先创建一个泛型的 List 类
List list = new List();
list.AddRange(new string[] { "ASP.NET 课程","J2EE 课程", "PHP 课程", "数据结构课程
" });
Predicate findPredicate = new Predicate(IsBookCategory);
List bookCategory = list.FindAll(findPredicate);
foreach (string str in bookCategory)
{
Console.WriteLine("{0}\t", str);
}
}
//谓词方法,这个方法将被传递给 FindAll 方法进行书书籍分类的判断
static bool IsBookCategory(string str)
{
return str.EndsWith("课程") ? true : false;
}
//使用匿名方法来进行搜索过程
static void FindListAnonymousMethod()
{
//先创建一个泛型的 List 类
List list = new List();
list.AddRange(new string[] { "ASP.NET 课程", "J2EE 课程", "PHP 课程", "数据结构课程
//在这里,使用匿名方法直接为委托创建一个代码块,而不用去创建单独的方
List bookCategory = list.FindAll
(delegate(string str)
{
return str.EndsWith("课程") ? true : false;
}
);
foreach (string str in bookCategory)
{
Console.WriteLine("{0}\t", str);
}
}
//使用 Lambda 来实现搜索过程
static void FindListLambdaExpression()
{
//先创建一个泛型的 List 类
List list = new List();
list.AddRange(new string[] { "ASP.NET 课程", "J2EE 课程", "PHP 课程", "数据结构课程
//在这里,使用了 Lambda 来创建一个委托方法
List bookCategory = list.FindAll((string str) => str.EndsWith("课程"));
foreach (string str in bookCategory)
{
Console.WriteLine("{0}\t", str);
}
}
" });
法
" });
}
}