C# Lambda表达式

来源:互联网 发布:什么是ai设计软件 编辑:程序博客网 时间:2024/05/29 17:49

本篇我们来讨论C#中的Lambda表达式。本篇会使用上一篇文章:C#委托中的Person类,代码如下

public delegate void MyDelegate();public class Person{    public string Name { get; set; }    public int Age { get; set; }    public void ZhuangBi(MyDelegate findTopic, MyDelegate findPerson)    {        //首先,找到话题        findTopic();        //然后,找到一个能够聊天的人        findPerson();        Console.WriteLine("I am newbility");    }}class Program{     static void Main(string[] args)     {        Person p = new Person();        MyDelegate delegate_FindTopic = FindTopic;        MyDelegate delegate_FindPersonToTalk = FindPersonToTalk;        p.ZhuangBi(delegate_FindTopic, delegate_FindPersonToTalk);     }    static void FindTopic()    {        Console.WriteLine("MongoDB is not too bad");    }    static void FindPersonToTalk()    {        Console.WriteLine("find a geek");    }}

我们现在思考这样一个问题啊,我这个人有强迫症,我觉得我在Program这个类中定义的两个方法FindTopic和FindPersonToTalk的功能都这么简单,能不能在调用Person.ZhuangBi这个方法时更加简化呢?
我们可以使用Lambda表达式。Lambda表达式本质上是一个匿名方法,顾名思义,匿名方法也是方法,只不过是没有方法名。可是,没有方法名怎么调用它呢?我们可以使用委托来调用它。
让我们使用Lambda表达式来改造一下我们的Program类

class Program{    static void Main(string[] args)    {        Person p = new Person();        MyDelegate delegate_FindTopic = () => { Console.WriteLine("MongoDB is not too bad"); };        MyDelegate delegate_FindPersonToTalk = () => Console.WriteLine("find a geek");        p.ZhuangBi(delegate_FindTopic, delegate_FindPersonToTalk);    }}

这样子写的好处是,我就不需要再为这两个简单的功能专门写两个方法了。如果你把代码复制到本地编译运行一下,结果是可以正常输出的。如果现在看不懂的话没关系,下面我们会介绍Lambda表达式的语法,看完语法后再来看这段代码,你也许就明白了。

下面我们来讲一些关于Lambda表达式的语法问题
Lambda表达式最基本的形式是

(input parameters) => expression(input parameters) => {}

我们上面说Lambda表达式本质上是一个方法,所以它就包含参数列表和返回值。上面的两种形式,第一种的箭头后面是一个表达式,第二种的后面是一个代码段。如果有返回值的话,第一种的表达式就是返回值,而第二种的返回值会在语句段中使用return关键字指定,跟一般的方法一样。例如,我们定义两个个Lambda表达式,都实现两个整数相加

Func<int, int, int> myFunc1 = (int a, int b) => a + b;Func<int, int, int> myFunc2 = (int a, int b) => { return a + b; };

Func< int, int, int>是系统定义的泛型委托,第一个泛型参数int是返回值,后面两个泛型参数int是参数列表。
仅当 lambda 只有一个输入参数时,括号才是可选的;否则括号是必需的。 括号内的两个或更多输入参数使用逗号加以分隔。下面我们定义一个Lambda表达式,求一个整数的平方,下面这几种写法都可以

Func<int, int> myFunc3 = x => x * x ;Func<int, int> myFunc4 = (x) => { return x * x; };Func<int, int> myFunc5 = (int x) => { return x * x; };Func<int, int> myFunc6 = x => { return x * x; };

参数是int型的x,返回值是 x*x。由于我们的委托类型Func< int, int>已经指定了方法的参数类型和返回值类型,所以,在Lambda表达式中,参数的类型可以省略。

Lambda表达式一般都跟委托一起使用。在Linq中也比较常用。

2 0