• C# Lambda表达式


    一、简介  

      Lambda表达式来源于数学家Alonzo Church等人在1920~1930期间发明的Lambad积分。Lambda积分是用于表示函数的一套系统,它使用希腊字母Lambda( λ )来表示无名函数。

      C# 3.0引入了Lambda表达式,它是一种简化的匿名函数,可用于创建委托或表达式目录树。你也可以将 Lambda 表达式作为参数进行传递,或者将它作用于函数调用值调用后返回的一个函数来使用。

    二、基础

      它的语法形式是: 输入参数 => 表达式或语句块  即运算符的左边是输入参数(如果有),右边是表达式或语句块。 ( “ => ” 读作 “ goes to ” )

      

      2.1 表达式Lambda

            表达式位于 => 运算符右侧的 lambda 表达式称为“表达式 lambda”。 表达式 Lambda 会返回表达式的结果,并采用以下基本形式:

        (input parameters) => expression
    复制代码
    delegate int myDel(int x,int y);    //声明委托
    
    class Program
        {
            static void Main(string[] args)
            {
                myDel del = (x,y) =>  x+y;    //返回x+y的结果
           Console.WriteLine("values {0}",del(5,8)); //输出13

          Console.ReadKey();
         }
      }
    复制代码

    有关Lambda表达式的参数列表要点如下:

    ♥ Lambda表达式参数列表中的参数必须在参数数量、类型和位置上与委托相匹配

    ♥    表达式参数列表中的参数不一定需要包含类型(隐式类型),除非委托有ref或out参数----此时必须注明类型(显式类型)

    ♥    如果只有一个参数,并且是隐式类型的,周围的圆括号可以被省略,否则必须有括号

    ♥    如果没有参数,必须使用一组空的圆括号

      2.2  语句Lambda

        当lambda表达式中,有多个语句时,写成如下形式:

        (input parameters) => {  statement; }

    复制代码
    delegate int myDel(string str);
    
        class Program
        {
            static void Main(string[] args)
            {
                myDel del = (str) =>
                {
                    Console.WriteLine("hello {0}",str);
                    return 123;
                };
                Console.WriteLine("values {0}",del("world"));
                Console.ReadKey();
            }
        }
    复制代码

    三、运用

      知道了Lamda的基本用法,下面看看怎么在LINQ和异步中使用它

      3.1   LINQ查询中使用Lambda表达式参数的示例

        引用MSDN中的例子。下面的示例演示如何通过 Enumerable.Where 标准查询运算符,在基于方法的查询中使用 lambda 表达式。 请注意,此示例中的 Where 方法具有一个 Func<TResult> 委托类型的输入参数,该委托采用整数作为输入并返回一个布尔值。 Lambda 表达式可以转换为该委托。

    复制代码
    class SimpleLambda
    {
        static void Main()
        {
    
            // Data source.
            int[] scores = { 90, 71, 82, 93, 75, 82 };
    
            // The call to Count forces iteration of the source
            int highScoreCount = scores.Where(n => n > 80).Count();
    
            Console.WriteLine("{0} scores are greater than 80", highScoreCount);
    
            // Outputs: 4 scores are greater than 80            
        }
    }
    复制代码

      3.2   使用异步Lambda表达式

       你可以使用异步 lambda 添加事件处理程序。 若要添加此处理程序,请在 lambda 参数列表前添加一个 async 修饰符,如下例,lambda表达式被注册为一个按钮点击事件的事件处理程序。

    复制代码
    public partial class Form1 : Form  
    {  
        public Form1()  
        {  
            InitializeComponent();  
            button1.Click += async (sender, e) =>      //异步Lambda表达式
            {  
                // ExampleMethodAsync returns a Task.  
                await ExampleMethodAsync();  
                textBox1.Text += "
    Control returned to Click event handler.
    ";  
            };  
        }  
      
        async Task ExampleMethodAsync()  
        {  
            // The following line simulates a task-returning asynchronous process.  
            await Task.Delay(1000);  
        }  
    }
    复制代码

      

  • 相关阅读:
    因特网中和多媒体有关的协议
    进程与线程
    线程模型
    SMP PVP Cluster
    读写者
    回调函数
    环境变量
    堆与栈的区别
    操作系统中的同步、异步、阻塞和非阻塞
    Razor潜入2令人疑惑的LocateOwner方法
  • 原文地址:https://www.cnblogs.com/summer2008/p/13730060.html
Copyright © 2020-2023  润新知