C# Labmda表达式

本篇我们来讨论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中也比较常用。

时间: 2024-10-27 13:32:09

C# Labmda表达式的相关文章

【Java8实战】Lambda表达式(一)

Java 8的Lambda表达式借鉴了C#和Scala等语言中的类似特性,简化了匿名函数的表达方式.Lambda表达式可以直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例.什么是函数式接口?简单来说就是只包含一个抽象方法的接口,允许有默认的实现(使用default关键字描述方法).函数式接口建议使用@FunctionalInterface注解标注,虽然这不是必须的,但是这样做更符合规范. 在Java 8之前,实现Runnable常用方式是编写一个匿名类: Thr

Java函数式编程(Lambda表达式)小记

函数式编程 函数式编程(Functional Programming)是编程范式的一种.最常见的编程范式是命令式编程(Impera Programming),比如面向过程.面向对象编程都属于命令式编程,大家用得最多.最熟悉.函数式编程并非近几年的新技术或新思维,其诞生已有50多年时间. 在函数式编程里面,一切都是数学函数.当然,函数式编程语言里也可以有对象,但这些对象是不可变的——要么是函数参数要么是返回值.函数式编程语言里没有for等循环,而是通过递归.把函数当成参数传递的方式实现循环效果.

201521123088《java程序设计》第十周学习总结

1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 答:try执行后finally才会执行,并且即使try中有return,finally也会执行. 用异常改进ArrayIntegerStack 题目4-3 2.1 截图你的提交结果(出现学号) 2.2 实验总结 1.如果栈满,抛出Full

201521123116 《java程序设计》第十周学习总结

1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 Q1 finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 答:需要注意的是分两种情况捕获异常,第一种是打开资源的时候可能抛出Exception异常,第二种是释放资源的时候可能抛出RuntimeException异常,最后无论成功与否都要释放资源,即用finally语句. Q2:用异常改进ArrayIntegerStack

201521123105 第10周Java学习总结

1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-21.1 截图你的提交结果(出现学号)1.2 4-2中finally中捕获异常需要注意什么? 答: 需要注意的是不管第一个try catch语句怎么样,都会执行finally中的内容.并且需要注意resource.close():可能发生异常需要抛出异常. 2.用异常改进ArrayIntegerStack 题目4-32.1 截图你

委托,多播

多播委托的时候:拿到的返回值是最后一个一个委托指向的方法的执行结果    创建委托:delegate int Adddel(int a,int b);    Adddel del=new Adddel(实例方法名);  不要用了 Func<int,int> funcdemo=new func<int,int>(方法名);  泛型委托 可以最多有16个参数的重载,最后一个参数永远都是返回值  俩个参数一个返回值 修正:第一个参数标识返回类型,第二个以后的为参数列表 简化泛型匿名方法:

201521044091 java 第十周学习总结

1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. Runnable不是线程,Thread才是,必须将实现Runnable接口的类的对象放入Thread中才能在线程中运行比如: Runnanble task = new MyRunnable(); Thread t1 = new Thread(task); t1.start(); 或者: new Thread(new MyRunnable()).start(); 2. 书面作业 本次PTA作业题集异常.多线

201521123087《Java程序设计》第10周学习总结

1. 本周学习总结 2. 书面作业 本次PTA作业题集异常.多线程 finally题目4-21.1 截图你的提交结果(出现学号)1.2 4-2中finally中捕获异常需要注意什么? 用异常改进ArrayIntegerStack题目4-32.1 截图你的提交结果(出现学号)2.2 实验总结 自定义异常题目5-44.1 截图你的提交结果(出现学号)4.2 自定义异常有哪几个关键点? 读取文件并组装对象实验任务书中中的题目3:读取文件并组装对象给出关键代码(需出现你的学号) 学会使用Eclipse进

C# 委托应用总结

一.什么是委托 委托基础拓展:http://www.cnblogs.com/yangyancheng/archive/2011/04/21/2024145.html 1.1官方解释 委托是一种定义方法签名的类型.当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联.您可以通过委托实例调用方法. 1.2个人理解 委托就是执行方法(函数)的一个类. 事件是一种特殊的委托. 二.如何申明委托 2.1 delegate public delegate int TestDelegate(int x