【C#基础教程】第二十三章、Lambda表达式

目录

1.Lambda表达式

1.1 创建委托

1.2 表达式树(表达式目录树)


1.Lambda表达式

  Lambda表达式的起源:源自匿名方法。可以把Lambda理解为一个匿名方法,它可以包含表达式和语句,并且创建委托或转换为表达式树。

  Lambda表达式的意义:足够简洁,方便程序员后期更好的看清程序结构、以及方便后期维护。

  Lambda表达式的定义:在使用Lambda表达式时,都会使用"=>"运算符(读作"goes to")。该运算符的左边是匿名方法的输入参数,右边是表达式或语句块。

   Lambda表达式的演变史:(下面的Func委托是代表有返回类型的委托)

class Program
{
    static void Main(string[] args)
    {
        //C#1.0    创建委托实例(需要回调方法)
        Func<string,int> test1 = new Func<string,int>(Callback);
        //C#2.0    用匿名方法创建(不需要回调方法)
        Func<string,int> test2 = callbackMethod
        {
          return str1.length;  
        };
        //C#3.0    使用Lambda表达式创建
        //第1种
        Func<string,int> text3 = (string str1) => str1.length;
        //第2种
        Func<string,int> text4 = (str1) => str1.length;
        //第3种
        Func<string,int> text5 = str1 => str1.length;
        
        //调用委托
        Console.WriteLine("使用Lanmbda表达式返回字符串的长度:"+text5("123"));
        
    }
    void Callback(string str1)
    {
        return str1.length;
    }
}

1.1 创建委托

 Lambda表达式的使用:

using System;
using System.Window.Forms;

class Program
{
    static viod Main(string[] args)
    {
        //创建实例
        Button button1=new Button();
        //Lambda表达式
        button1.Click +=(sender,e) => CallbackEvent("点击事件",sender,e);
        button1.KeyRress +=(sender,e) => CallbackEvent("键盘按下事件",sender,e);
        //对象初始器
        Form form = new Form{Name="",AutoSize=true,Controls={button1}};

        //运行窗体
        Application.Run(form);
    }

    //事件的回调方法
    static void CallbackEvent(string title,object sender,EventArgs e)
    {
        Console.Writeline("发生的事件是{0}",title);
        Console.Writeline("发生的事件的对象是{0}",sender);
        Console.Writeline("发生的事件参数是{0}",e.GetType());
    }
}

1.2 表达式树(表达式目录树)

  表达式树的定义:用来表示Lambda表达式逻辑的一种树形的数据结构,它将代码表示成一个对象树,而非可执行的代码。

  动态构造一个表达式树:

using System;
//引入Expression<TDelegate>类的命名空间
using System.Linq.Expression;

class Program
{
    static void Main(string[] args)
    {
        //表达式参数
        ParameterExpression a = Expression.Parameter(typeof(int),"a");
        ParameterExpression b = Expression.Parameter(typeof(int),"b");
        //表达式树的主体部分
        BinaryExpression be = Expression.Add(a,b);
        //构造表达式树
        Expression<Func<int,int,int>> expressionTree = Expression.Lambda<Func<int,int,int>>(be,a,b);
        //分析树结构,获取表达式树的主体
        BinaryExpression body = (ParameterExpression)body.Body;
        //左节点,每个节点本身是一个表达式对象
        BinaryExpression left = (ParameterExpression)body.Left;
        //右节点
        BinaryExpression right = (ParameterExpression)body.Right;

        //输出表达式树结构
        Console.WriteLine("表达式树的结构为{0}",expressionTree);
    }
}
//output:
//<a,b>=><a+b>

动态构造表达式树图示

  通过Lambda表达式构造表达式树:

using System;
//引入Expression<TDelegate>类的命名空间
using System.Linq.Expression;

class Program
{
    static void Main(string[] args)
    {
        //构造表达式树
        Expression<Func<int,int,int>> expressionTree = (a.b) =>a+b;
        //分析树结构,获取表达式树的主体
        BinaryExpression body = (ParameterExpression)body.Body;
        //左节点,每个节点本身是一个表达式对象
        BinaryExpression left = (ParameterExpression)body.Left;
        //右节点
        BinaryExpression right = (ParameterExpression)body.Right;

        //输出表达式树结构
        Console.WriteLine("表达式树的结构为{0}",expressionTree);
    }
}
//output:
//<a,b>=><a+b>

  把表达式树转换成可执行的代码:

using System;
//引入Expression<TDelegate>类的命名空间
using System.Linq.Expression;

class Program
{
    static void Main(string[] args)
    {
        //构造表达式树
        Expression<Func<int,int,int>> expressionTree = (a.b) =>a+b;
        //分析树结构,获取表达式树的主体
        BinaryExpression body = (ParameterExpression)body.Body;
        //通过Compile方法来生成Lambda表达式的委托
        Func<int,int,int> delinstance = expressionTree.Compile();
        
        int result = delinstance(2,3);
        Console.WriteLine("和为{0}",result);
    }
}
//output:
//<a,b>=><a+b>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ohrkaninchen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值