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     }

效果:

 

posted on 2012-09-27 10:16  YZDONET  阅读(235)  评论(0编辑  收藏  举报