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

      在之前 委托的简单使用 一文中有个令大家很难受的写法,仅仅只有一行代码却单独需要声明一个方法,然后将这方法传递给委托。

    //3.委托初级版 需要声明多个方法
                {
                    Console.WriteLine("***************委托初级版  需要声明多个方法******************");
                    Func<Double, Double, Double> delplus = new Func<double, double, double>(delPlus);// 3. 实例化委托
                    //Func<Double, Double, Double> delplus = delPlus;
                    Console.WriteLine(delCalculate(10, 5, delplus));
    
                    Func<Double, Double, Double> delminus = new Func<double, double, double>(delMinus);
                    Console.WriteLine(delCalculate(10, 5, delminus));
    
                    Func<Double, Double, Double> delmultiply = new Func<double, double, double>(delMultiply);
                    Console.WriteLine(delCalculate(10, 5, delmultiply));
    
                    Func<Double, Double, Double> deldivide = new Func<double, double, double>(delDivide);
                    Console.WriteLine(delCalculate(10, 5, deldivide));
                    Console.WriteLine("***************结束******************");
                }
    
    #region 委托
            #region 自己声明委托
            //delegate Double del(Double x, Double y);  // 1. 声明委托 方法签名需要一致 
            //private Double delCalculate(Double x, Double y, del del)
            //{
            //    Double results = del.Invoke(x, y);  //4. 使用委托
            //    //把x y写入数据库 写入日志等等操作
            //    return results * 1000;
            //}
            #endregion
    
            #region 使用func委托
            private Double delCalculate(Double x, Double y, Func<Double, Double, Double> del)
            {
                Double results = del.Invoke(x, y);  //4. 使用委托
                //把x y写入数据库 写入日志等等操作
                return results * 1000;
            }
            #endregion
    
            #region  委托需要的方法  
            private Double delPlus(Double x, Double y)   //2. 写委托用的方法
            {
                return x + y;
            }
            private Double delMinus(Double x, Double y)
            {
                return x - y;
            }
            private Double delMultiply(Double x, Double y)
            {
                return x * y;
            }
            private Double delDivide(Double x, Double y)
            {
                return x / y;
            }
            #endregion
    
            #endregion

      先来看一段代码,看完之后相信各位都能明白Lambda的写法。

    {
                    //需要声明一个方法 然后声明委托时调用
                    Func<Double, Double, Double> func = new Func<Double, Double, Double>(Plus);
                    Console.WriteLine(func.Invoke(10, 5));
                }
                {
                    //不需要额外声明一个方法  在声明委托时直接写方法(用delegate替代方法名与修饰符)
                    Func<Double, Double, Double> func = new Func<Double, Double, Double>(delegate (Double x, Double y)
                        {
                            return x + y;
                        });
                    Console.WriteLine(func.Invoke(10, 5));
                }
                {
                    //lambda表达式成型 语法糖 匿名方法
                    Func<Double, Double, Double> func = new Func<Double, Double, Double>( (Double x, Double y) =>
                    {
                        return x + y;
                    });
                    Console.WriteLine(func.Invoke(10, 5));
                }
                {
                    //可以去掉参数中的类型签名 
                    //因为写在委托内的方法(正确写法)说明了这个方法是符合签名委托声明的约束的 
                    //所以方法中的参数类型与委托中的参数类型相对应
                    Func<Double, Double, Double> func = new Func<Double, Double, Double>((x,y) =>
                    {
                        return x + y;
                    });
                    Console.WriteLine(func.Invoke(10, 5));
                }
                {
                    //如果方法体只有一行 可以去掉大括号 分号 return
                    Func<Double, Double, Double> func = new Func<Double, Double, Double>((x, y) => x + y);
                    Console.WriteLine(func.Invoke(10, 5));
                }
                {
                    //委托的声明 是可以去掉new 直接写等于方法的 所以最终使用了lambda表达式的委托如下
                    //Func<Double, Double, Double> func = Plus;
                    Func<Double, Double, Double> func = (x, y) => x + y;
                    Console.WriteLine(func.Invoke(10, 5));
                    
                    //Func<Double, Double> func2 = x => x + 5;
                    //Func<Double> func3 = () => 10 + 5;
                }

      经过层层改良,最终有了Lambda。Lambda表达式是由左边参数、中间=>(英文读作"goes to",中文可以读作"转到”)符号、右边为方法体。

      回到上篇文章因为x与y的加减乘除需要写四个方法,使用了Lambda之后:

    //4.委托进阶版 委托加lambda表达式
                {
                    Console.WriteLine("***************委托进阶版  委托加lambda表达式******************");
                    Console.WriteLine(delCalculate(10, 5, (x, y) => x + y));
                    Console.WriteLine(delCalculate(10, 5, (x, y) => x - y));
                    Console.WriteLine(delCalculate(10, 5, (x, y) => x * y));
                    Console.WriteLine(delCalculate(10, 5, (x, y) => x / y));
                    Console.WriteLine("***************结束******************");
                }
  • 相关阅读:
    第一个django
    windows安装django
    Uva 705
    UVa 10034
    ACM中出现RuntimeError的原因及可能的解决办法
    [转载]最小生成树-Prim算法和Kruskal算法
    Uva 10305 Ordering Tasks
    Uva 793 Network Connections
    Uva 10608 Friends
    Uva 10583 Ubiquitous Religions
  • 原文地址:https://www.cnblogs.com/binzi/p/9877980.html
Copyright © 2011-2022 走看看