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

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C#中的Lambda表达式是一种简洁的语法形式,可以用来创建匿名函数。Lambda表达式通常用于函数式编程和LINQ查询。引用中提到,在日常使用C#编程的过程中,会经常使用到lambda表达式Lambda表达式使用=>运算符,将输入参数映射到函数体中的表达式。表达式Lambda位于=>运算符右侧,称之为“表达式Lambda”。 Lambda表达式可以有一个或多个输入参数,并且可以返回一个值。在C#中,Lambda表达式的类型是委托类型,可以赋值给该委托类型的变量。 Lambda表达式的主体可以包含方法的调用,也可以只是一个表达式。当Lambda表达式只有一个表达式时,表示这里面只允许有一行代码。 例如,在C#中,可以使用Lambda表达式定义一个匿名方法,如下所示: ``` Func<int, int> func = x => x * 4; ``` 这个Lambda表达式接收一个int类型的参数x,并返回x乘以4的结果。可以通过调用func方法来使用Lambda表达式,例如: ``` int result1 = func(5); ``` 这样就可以得到x等于5时的结果。Lambda表达式还可以在表达式主体中调用其他方法,如下所示: ``` func = x => x * Add(3, 2); int result2 = func(5); ``` 这个Lambda表达式将x乘以Add(3, 2)的结果作为返回值。在这个例子中,Add是一个方法,接收两个int类型的参数x和y,并返回它们的和。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C# Lambda表达式](https://blog.csdn.net/qq_39847278/article/details/127525222)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊思宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值