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("***************结束******************");
            }

 

posted @ 2018-10-30 17:11  binzi-6  阅读(210)  评论(0编辑  收藏  举报