.net高级技术——lambda表达式

  • Post author:
  • Post category:其他


自C#3.0开始,就可以使用一种新语法把实现代码赋予委托:lambda表达式。只要有委托参数类型的部分,就可以使用Lambda表达式。

下面先来看几个例子

 static void Main(string[] args)
        {
            Action<int> a1 = delegate (int n) { n = n + 1; };//最原始的写法
            Action<int> a2 =  (int n)=>{ n = n + 1; };//进行第一步改造,可以删除delegate 然后在int n后面使用=>,读作goes to
            Action<int> a3 = (n) => { n = n + 1; };//进行第二步改造,可以删除类型,因为类型可以由前面推断出来
            Action<int> a4 = n => { n = n + 1; };//进行第二步改造,由于只有一个参数,所以连括号也可以删除,这就是这个匿名委托最简单的方式

            //第二个例子
            Func<int,string,int> f1 = delegate (int n,string s) { return n; };//这是最原始的写法
            Func<int,string,int> f2 = (int n,string s)=>{ return n; };//进行第一步改造,删除delegate,加入=>符号
            Func<int,string,int> f3 = ( n, s)=>{ return n; };//删除类型
            //Func<int,string,int> f4 =  n, s=>{ return n; };//由于有多个参数,所以不能删除括号,否则会报错
            Func<int,string,int> f4 = ( n, s)=> n;//如果方法体只有一句代码且是返回值代码,那么可以省去return和{},这个就是最简的方式


        }

使用反编译器查看到的代码

通过上面的例子演示了有返回值和无返回值,单个参数与多个参数的例子,我们来总结下lambda表达式的用法以及规则

1.可以省去delegate关键字

2.可以省去参数类型

3.如果只有一个参数,可以省去括号

4.如果方法有返回值,且方法只有一句代码,这句代码还是返回值代码,那么就可以省去return和{},直接写要返回的值就可以了

下面通过例子来练习下Lambda表达式

            Func<int, string> f5 = delegate (int n) { return "你好" + n; };
            Console.WriteLine(f5(4));
            Console.ReadKey();

对上面例子进行简化代码

            Func<int, string> f6 = (int n) => { return "你好" + n; };
            Func<int, string> f7 = (n) => { return "你好" + n; };
            Func<int, string> f8 = n => { return "你好" + n; };
            Func<int, string> f9 = n => "你好" + n;

最终可以简化成f9这个样子

下面再来一个例子

            Func<int, string> n1 = n => "你能反推回去吗???"+n;
            Console.WriteLine(n1(1));

下面是推导过程

            //第四个例子
            Func<int, string> n1 = n => "你能反推回去吗???" + n;
            Func<int, string> n2 = n => { return "你能反推回去吗???" + n; };
            Func<int, string> n3 = (n) => { return "你能反推回去吗???" + n; };
            Func<int, string> n4 = (int n) => { return "你能反推回去吗???" + n; };
            Func<int, string> n5 = delegate(int n){ return "你能反推回去吗???" + n; };
            Console.WriteLine(n1(1));
            Console.ReadKey();

下面我们来改造下之前写的GetMax方法

     delegate bool CompareNum(object obj1, object obj2);

    class Program
    {
        static void Main(string[] args)
        {
            int[] nums = { 1, 2, 23, 321, 124, 24321, 214 };
            //Func<object, object, bool> cpn = delegate (object obj1, object obj2)
            //{
            //    int i1 = (int)obj1;
            //    int i2 = (int)obj2;
            //    return i1 > i2;
            //};
            //Func<int, int, bool> f1 = delegate (int n1, int n2) { return n1 > n2; };
            //Func<int, int, bool> f1 =  (int n1, int n2)=>{ return n1 > n2; };
            //Func<int, int, bool> f1 =  ( n1,  n2)=>{ return n1 > n2; };
            //Func<int, int, bool> f1 = (n1, n2) => n1 > n2;
            //int max = (int)GetMax(nums, f1);
            //Console.WriteLine(max);

            //对Person的age进行比较
            Person[] p1 = new Person[] { new Person() { Age = 12, Name = "张三" }, new Person() { Age = 22, Name = "历史" }, new Person() { Age = 23, Name = "王五" } };
            Func<Person, Person, bool> f2 = (n1, n2) => n1.Age > n2.Age;
            Person max = (Person)GetMax<Person>(p1, f2);
            Console.WriteLine(max.ToString());
            Console.ReadKey();
        }
        static T GetMax<T>(T[] obj, Func<T, T, bool> f1)
        {
            T max = obj[0];
            for (int i = 1; i < obj.Length; i++)
            {
                if (!f1(max, obj[i]))
                {
                    max = obj[i];
                }
            }
            return max;
        }
    }
    public class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
        public override string ToString()
        {
            return "姓名是:" + Name + ",年龄是" + Age;
        }
    }

现在上面我们创建一个比较整型的委托,还有一个比较人的年龄的委托,这样写起来十分舒适,十分简单。只需要一句代码就能搞定了!!!

—本博客是学习以后记录知识,如有侵权,请联系删除!!!!



版权声明:本文为qq_33407246原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。