C# Lambda表达式和委托

目录

一、概述

二、Lambda的发展史

三、Action的用法

四、Func的用法

结束


一、概述

 "Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量。它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。

二、Lambda的发展史

比如有这样一个场景,在给出的List集合中找出数字大于等于18的数字,假如我们不知道有 Linq 这种东西!

常规写法:

using System;
using System.Collections.Generic;

namespace LambadTest
{
    internal class Program
    {
        static List<int> AgeList = new List<int> { 16, 17, 18, 19, 20 };

        static void Main(string[] args)
        {
            List<int> list = OutPutAge();
            Console.WriteLine(string.Join(",", list));

            Console.ReadKey();
        }

        static List<int> OutPutAge()
        {
            List<int> list = new List<int>();
            foreach (int item in AgeList)
            {
                if (item > 18)
                {
                    list.Add(item);
                }
            }
            return list;
        }
    }
}

输出:

这样写虽然能获取正确的值,但单独为它创建一个方法感觉有些浪费,问题是又必须用到这个方法,有时候还思考半天该给这个方法取什么名字,这时候 Lambda 就派上用场了!Lambda 最早是由委托转化而来,下面来介绍一下Lambda 的发展史,首先来看看委托的一些基本用法:

using System;

namespace LambadTest
{
    internal class Program
    {
        public delegate void SayHi(string msg);

        static void Main(string[] args)
        {
            SayHi sayHi = delegate(string msg) 
            {
                Console.WriteLine(msg);
            };
            sayHi("你好!");

            Console.ReadKey();
        }
    }
}

运行:

上面的代码,其实转换一下,就是下面的写法

using System;

namespace LambadTest
{
    internal class Program
    {
        public delegate void SayHi(string msg);

        static void Main(string[] args)
        {
            SayHi sayHi = SayHello;
            sayHi("你好!");

            Console.ReadKey();
        }

        static void SayHello(string message)
        {
            Console.WriteLine(message);
        }
    }
}

委托虽然可以不用单独创建一个方法就能随时使用,但是这样写还是有些不方便,给委托赋值还要加个 delegate ,总觉得写法有点别扭,有人可能会问,能不能去掉 delegate 呢? 下面就介绍如何去掉 deleagte:

using System;

namespace LambadTest
{
    internal class Program
    {
        public delegate void SayHi(string msg);

        static void Main(string[] args)
        {
            SayHi sayHi = (string msg) =>
            {
                Console.WriteLine(msg);
            };
            sayHi("你好!");

            Console.ReadKey();
        }
    }
}

在上面代码中,括号中的 string 可以不写,效果一样的,如下

using System;

namespace LambadTest
{
    internal class Program
    {
        public delegate void SayHi(string msg);

        static void Main(string[] args)
        {
            SayHi sayHi = (msg) =>
            {
                Console.WriteLine(msg);
            };
            sayHi("你好!");

            Console.ReadKey();
        }
    }
}

如果方法内的代码只有一行,甚至连 {  }  都不用写,直接用下面的写法就可以了

using System;

namespace LambadTest
{
    internal class Program
    {
        public delegate void SayHi(string msg);

        static void Main(string[] args)
        {
            SayHi sayHi = (msg) => Console.WriteLine(msg); 
            sayHi("你好!");

            Console.ReadKey();
        }
    }
}

上面的例子介绍了那么多,依然不是特别方便,因为我们还定义了委托,委托在定义的时候,已经固定好了参数的类型,如果我要用其他的类型参数,又要重新去定义一个委托了,那么又没有更好的方法呢,下面就介绍下 Action

using System;

namespace LambadTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Action<string, string> sayHi = (name, message) =>
            {
                Console.WriteLine("{0}说{1}", name, message);
            };
            sayHi("张三", "你好");

            Console.ReadKey();
        }
    }
}

运行:

三、Action的用法

Action 是委托的一种,主要特征是无返回值,在 C# 开发中,常用来作为回调函数来使用。

例一:

using System;

namespace 委托的用法
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Action<int> callback = (res) => Console.WriteLine("结果:" + res);
            GetResult(3, 4, callback);

            Console.ReadKey();
        }

        static void GetResult(int x,int y, Action<int> callback)
        {
            int result = x + y;
            callback(result);
        }
    }
}

运行:

例二:

using System;

namespace 委托的用法
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Test test = new Test();
            test.CallBack = ReceiveCallback;
            test.SayHi();

            Console.ReadKey();
        }

        static void ReceiveCallback(int res)
        {
            Console.WriteLine("结果:" + res);
        }
    }

    public class Test
    {
        public Action<int> CallBack;

        public void SayHi()
        {
            Console.WriteLine("hey man!");
            if (CallBack != null)
                CallBack(1);
        }
    }
}

运行:

四、Func的用法

在上节中使用 Action 时,可以看到,Action 所指向的函数体都是 void 类型,但假设我们需要返回值怎么办呢,Func 就可以帮你解决这个问题。

在 Func 中,最后一个参数是返回值的类型,如下:

using System;

namespace 委托的用法
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Func<string, string, bool> checkName = (lastName, name) =>
            {
                if(lastName == "王" && name == "老")
                    return true;
                else
                    return false;
            };

            bool result = checkName("王", "老");
            Console.WriteLine("结果:{0}", result);

            Console.ReadKey();
        }
    }
}

运行:

结束

如果这个帖子对你有所帮助,欢迎 关注 + 点赞 + 留言

end

猜你喜欢

转载自blog.csdn.net/qq_38693757/article/details/130029045
今日推荐