C# Lambda表達式

1、簡介  

  Lambda表達式來源於數學家Alonzo Church等人在1920~1930期間發明的Lambad積分。Lambda積分是用於表示函數的一套系統,它使用希臘字母Lambda( λ )來表示無名函數。express

  C# 3.0引入了Lambda表達式,它是一種簡化的匿名函數,可用於建立委託或表達式目錄樹。你也能夠將 Lambda 表達式做爲參數進行傳遞,或者將它做用於函數調用值調用後返回的一個函數來使用。api

 

2、基礎

  它的語法形式是: 輸入參數 => 表達式或語句塊  即運算符的左邊是輸入參數(若是有),右邊是表達式或語句塊。 ( 「 => 」 讀做 「 goes to 」 )異步

  

  2.1 表達式Lambda

        表達式位於 => 運算符右側的 lambda 表達式稱爲「表達式 lambda」。 表達式 Lambda 會返回表達式的結果,並採用如下基本形式:async

    (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表達式的參數列表要點以下:ide

♥ Lambda表達式參數列表中的參數必須在參數數量、類型和位置上與委託相匹配函數

♥    表達式參數列表中的參數不必定須要包含類型(隱式類型),除非委託有ref或out參數----此時必須註明類型(顯式類型)ui

♥    若是隻有一個參數,而且是隱式類型的,周圍的圓括號能夠被省略,不然必須有括號spa

♥    若是沒有參數,必須使用一組空的圓括號code

 

  2.2  語句Lambda

    當lambda表達式中,有多個語句時,寫成以下形式:orm

    (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();
        }
    }

 

3、運用

  知道了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 += "\nControl returned to Click event handler.\n";  
        };  
    }  
  
    async Task ExampleMethodAsync()  
    {  
        // The following line simulates a task-returning asynchronous process.  
        await Task.Delay(1000);  
    }  
}

 

  有關異步和LINQ的知識,能夠參閱我之前寫過的博客

相關文章
相關標籤/搜索