C# Lambda表达式
一、概念
Lambda 表达式是一种匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。
二、格式
格式为:(参数列表)=>表达式或者语句块。
可以有多个参数,一个参数,或者无参数。参数类型可以隐式或者显式。例如:
(x, y) => x * y //多参数,隐式类型=> 表达式
x => x * 10 //单参数, 隐式类型=>表达式
x => { return x * 10; } //单参数,隐式类型=>语句块
(int x) => x * 10 // 单参数,显式类型=>表达式
(int x) => { return x * 10; } // 单参数,显式类型=>语句块
() => Console.WriteLine() //无参数
三、Lambda 表达式的简单应用
使用lambda表达式的时候,不得不提到泛型委托。在上面我们定义的表达式如:(x,y)=>x*y,返回的是一个委托;
1、如何调用定义的表达式:
- 可以定义自己的函数委托 (C# 1.0和2.0)
- 可以使用.NET类库中已经提供的泛型委托Func<T>(C#3.0)
2、实例:
View Code
1 class Program 2 { 3 public delegate int addOneDelegate(int item1, int item2); 4 5 static void Main(string[] args) 6 { 7 Func<int, bool> f1 = x => x > 0; 8 Func<int, int, int> f = (x, y) => x * y; 9 10 addOneDelegate fun=(item1,item2)=>item1+item2; 11 var result=fun(123,456); 12 Console.WriteLine(result.ToString()); 13 Console.WriteLine(f(100, 200).ToString()); 14 Console.WriteLine(f1(-3)); 15 Console.ReadLine(); 16 } 17 }
效果:
Func<T>提供了多个重载,最后的一个类型是指返回结果的类型,前面都是输入参数类型
四、Lambda 表达式树
1.lambda表达式都可以通过表达式树来描述,就不用在代码中直接编写表达式。这样的优势就是表达式可以在运行的时候编译运行,而且可以对lambda表达式进行动态修改。
2.要使用lambda表达式树,首先提到一个表达式的泛型类Expression<T>,(域名空间System.Linq.Expressions),这个类是保存表达式的结构信息。我们把Expession看作一棵树结构,每个结点都是由两部分组成,左树和右树,一直这样递归下去。
实例:
View Code
1 class Program 2 3 { 4 static void Main(string[] args) 5 6 { 7 8 Expression<Func<int, bool>> filter = m=> (m * 4) < 2; 9 10 BinaryExpression lt = (BinaryExpression)filter.Body; 11 12 BinaryExpression mult = (BinaryExpression)lt.Left; 13 14 ParameterExpression en = (ParameterExpression)mult.Left; 15 16 ConstantExpression three = (ConstantExpression)mult.Right; 17 18 ConstantExpression five = (ConstantExpression)lt.Right; 19 20 var One = filter.Compile(); Console.WriteLine("Result: {0},{1}", One(5), One(1)); 21 22 Console.WriteLine("({0} ({1} {2} {3}) {4})", lt.NodeType, mult.NodeType, en.Name, three.Value, five.Value); 23 24 Console.ReadLine(); 25 } 26 27 }
效果: