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

 

  有關異步和LINQ的知識,可以參閱我以前寫過的博客

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM