zoukankan      html  css  js  c++  java
  • Lambda表达式

    "Lambda表达式"是一个匿名函数,它可以包含表达式和语句.并可用于创建委托或表达式目录树类型.

    运算符

    所有Lambda表达式都是用Lambda运算符=>,读做goes to.该运算符左边是输入参数,右边包含表达式或语句块.

    Lambda表达式 x=>x*x读作 x goes to x 乘 x.可将此表达式分配给委托类型.

    例:

    protected void Page_Load(object sender, EventArgs e)
    {
        cc c = x => x * x;
    
        Response.Write(c(12).ToString());
    }
    
    public delegate int cc(int i);

    在上例中,请注意委托的参数是一个具有int类型的隐式类型输入参数,并返回int.在将lambda表达式转化为该类型的委托时,编译器会隐式的将该表达式中的参数转换为int.并返回一个int类型的值.

    =>运算符具有与=运算符同级的优先级,并且是右结合运算符.

    Lambda表达式

    表达式在右边的Lambda表达式称为"Lambda表达式".采用以下基本形式.

    (input parameters)=>expression

    在lambda表达式只有一个参数时,括号才是可选的;否则括号是必须的.建议保留括号.

    Lambda语句

    Lambda语句与Lambda表达式相似,只是语句包含在大括号里.

    (input parameters)=>{statement;}

    Lambda语句的主体可以包含任意数量的语句.但是通常不会多与两句或三句.

    Lambda表达式的类型推理

    在编写Lambda时,通常不必为输入参数指定类型,因为编译器可以基于Lambda主体、基础委托类型以及C#3.0语言规范中描述的其他因素推断类型.

    Lambda的一般规则如下:

    1.lambda包含的参数数量必须与委托类型包含的参数数量一致

    2.lambda中每个输入参数必须都能够隐式转换为其对应的委托参数

    3.lambda的返回值必须能隐式的转换为委托的返回类型

    例子:

    bool GetStringWithFourCharacters(string str)
    {
        return str.Length == 4;
    }
    
    protected void Page_Load(object sender, EventArgs e)
    {
        string[] strs = new string[] { "abcd""bcde", "123s", "acee",  };
    
        //方法一、
        //创建Func<string,bool>的实例这种方式来获取方法与下面一种直接赋值的做法都可以.
        //Func<string, bool> func = new Func<string, bool>(GetStringWithFourCharacters);
        Func<string, bool> func = GetStringWithFourCharacters;
        IEnumerable<string> result = strs.Where<string>(func);
    
        //方法二、
        //IEnumerable<string> result = strs.Where<string>(delegate(string x) { return x.Length == 4; });
    
        //方法三、
        //IEnumerable<string> result = strs.Where<string>(x => x.Length == 4);
        foreach (var r in result)
        {
            Response.Write(r.ToString()+"<br/>");
        }
    }

    这三种方式都可以实将字符串数组中,为四个字符的字符串挑出来的功能.但是,哪一个最简单呢?显然第一个复杂些,第二个和第三个都比较简单.

    其实第二个和第三个是等价的.建议使用第三种,上面的例子比较简单,只需要筛选出来即可,如果再要求都转成大写的呢? 再进行排序呢?

    protected void Page_Load(object sender, EventArgs e)
    {
        string[] strs = new string[] { "abcd", "bcde", "123s", "acee" };
    
        //方法二
        //IEnumerable<string> result = strs.Where<string>(delegate(string x) { return x.Length == 4; })
        //                                 .Select<string, string>(delegate(string x) { return x.ToUpper(); })
        //                                 .OrderBy<string, string>(x => x);
        
        //方法三
        IEnumerable<string> result = strs.Where<string>(x => x.Length == 4)
                                        .Select<string, string>(x => x.ToUpper())
                                        .OrderBy<string, string>(x => x);
        
        foreach (var r in result)
        {
            Response.Write(r.ToString()+"<br/>");
        }
    }

    从代码中,可以看到,使用Lambda表达式似乎更简单一些的

    Lambda表达式在上例中的使用是:

      1. 选出只有4个字符的字符串
      2. 将字符串变成大写的
      3. 进行排序
  • 相关阅读:
    Spring整合CXF之添加拦截器
    Spring整合CXF之发布WebService服务
    CXF添加自定义拦截器
    cxf处理一些Map等复杂类型
    webservice执行过程深入理解
    谈谈房车
    关于贷款消费
    记一次玩比特币的经历
    那年K城暑期工
    SpringBoot整合Xxl-Job
  • 原文地址:https://www.cnblogs.com/oneword/p/1820704.html
Copyright © 2011-2022 走看看