zoukankan      html  css  js  c++  java
  • C# 3.0 / C# 3.5 Lambda 表达式

    概述

       Lambda 表达式的本质就是匿名函数。(而匿名方法的本质是委托

       “Lambda 表达式”是一个匿名函数,可以包含表达式和语句,并且可用于创建委托或表达式树类型。 (Lambda 表达式的运算符为 =>,读作“goes to”。=> 运算符具有与赋值运算符(=)相同的优先级)

      Lambda 的基本形式是:

        (input parameters) => expression

        只有在 Lambda 有一个输入参数时,括号才是可选的,否则括号是必需的

        两个或更多输入参数由括在括号中的逗号分隔: (x, y) => x==y 。

      有时,编译器难于或无法推断输入类型。如果出现这种情况,您可以按以下示例中所示的方式显式指定类型:

        (int x, string s) => s.Length > x

      使用空括号指定零个输入参数:

        () => SomeMethod()

      最常用的场景是 IEnumerable 和 IQueryable 接口的 Where(c => c.Id > 3)

    下列规则适用于 Lambda 表达式中的变量范围:

        捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止。

        在外部方法中看不到 Lambda 表达式内引入的变量。

        Lambda 表达式无法从封闭方法中直接捕获 ref 或 out 参数。

        Lambda 表达式中的返回语句不会导致封闭方法返回。

        Lambda 表达式不能包含其目标位于所包含匿名函数主体外部或内部的 goto 语句、break 语句或 continue 语句。

    Lambda 表达式缩写推演

                new Func<string, int>(delegate (string str) { return str.Length; });
                delegate (string str) { return str.Length; }    //匿名方法
                (string str) => { return str.Length; }    //Lambda语句
                (string str) => str.Length          //Lambda表达式
                (str) => str.Length        //让编译器推断参数类型
                str => str.Length        //去掉不必要的括号

     应用实例

      一、

        delegate int AddDel(int a, int b);      //定义一个委托(与类同级)
    
    
            #region
            AddDel fun = delegate (int a, int b) { return a + b; };     //匿名函数
            AddDel funLambda = (a, b) => a + b;                         //lambda本质就是匿名函数(lambda参数类型可以进行隐式推断,可以省略类型)
            //Console.WriteLine(fun(1, 3));
    
            List<string> strs = new List<string>() { "1", "2", "3" };
            var temp = strs.FindAll(s => int.Parse(s) > 1);
    
            foreach(var item in temp)
            {
              Console.WriteLine(item);
            }
            //Console.WriteLine(funLambda(1, 3));
            #endregion

      二、

            static bool GetEvenNum(int num)
            {
                if(num % 2 == 0)
                {
                    return true;
                }
                return false;
            }
    
    
                List<int> nums = new List<int>() { 1, 2, 3, 4, 6, 9, 12 };
    
                //使用委托方式
                List<int> evenNums = nums.FindAll(GetEvenNum);
                foreach(var item in evenNums)
                {
                    Console.WriteLine(item);
                }
    
    
                Console.WriteLine("使用 lambda 的方式");
                List<int> evenNumLambda = nums.FindAll(n => n % 2 == 0);
                foreach (var item in evenNumLambda)
                {
                    Console.WriteLine(item);
                }
                Console.ReadKey();
  • 相关阅读:
    PL/SQL连接错误:ora-12705:cannot access NLS data files or invalid environment specified
    java 后台开发关键词解释
    架构、框架和设计模式关系(转)
    Web.xml配置详解
    SVN“验证位置时发生错误”的解决办法
    java遍历给定目录,树形结构输出所有文件,包括子目录中的文件
    android EditText 默认情况下不获取焦点(不弹出输入框)
    android listview item取消按点击效果
    如何实现可动态调整隐藏header的listview
    eclipse 启动到loading workbench... 自动关闭
  • 原文地址:https://www.cnblogs.com/zhangchaoran/p/8778800.html
Copyright © 2011-2022 走看看