程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 從匿名方法到 Lambda 表達式的推演過程,lambda推演

從匿名方法到 Lambda 表達式的推演過程,lambda推演

編輯:C#入門知識

從匿名方法到 Lambda 表達式的推演過程,lambda推演


Lambda 表達式是一種可用於創建委托或表達式目錄樹類型的匿名函數。 通過使用 lambda 表達式,可以寫入可作為參數傳遞或作為函數調用值返回的本地函數。 以上是msdn官網對Lambda 表達式的描述。實質上Lambda 表達式可以說是從匿名方法推演而來,微軟程序員為了提高我們廣大程序員的生產效率推出了Lambda 表達式,它的出現無疑是極具影響力的。

Lambda 表達式使用Lambda 運算符=>,我們一般讀作“goes to”,當然這並不是說它跟C#中的goto有相同的含義,只是都有“轉到”的意思罷了。Lambda 表達式的書寫規則如下:

參數列表=>表達式

現在就讓我來講解下從匿名方法到Lambda 表達式的推演過程。以上篇博文的例子為例,

//假設需要從list集合中獲取大於3的所有元素以新集合返回
List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6 };
var newlist = list.FindAll(delegate(int i) { return i > 3; });

這是用匿名方法實現的寫法。微軟程序員覺得這樣子不夠簡單,為了簡便寫法,便有了如下的推斷過程。

首先既然你總是要傳入一個匿名方法,總是會有delegate這個關鍵字,於是可以考慮將delegate去掉。去掉了delegate,那麼書寫就不規范了,於是就引入了=>運算符用來連接參數列表與表達式,這樣上式便變成:

var newlist = list.FindAll((int i) => { return i > 3; });

其次,int這個類型是可以推斷出來的,當用鼠標指到"FindAll"的時候就可以看到:

這便讓我們知道這裡delegate後續的入參是int型(本例是int型,因為上面的集合是int型,實際上什麼類型是看你自己需求的),於是再指定類型為int顯得有點多余,因此可以寫成這樣:

var newlist = list.FindAll((i) => { return i > 3; });

而此時參數只有一個,因此括號也可以去掉:

var newlist = list.FindAll(i => { return i > 3; });

然後,FindAll()需要傳入一個Predicate<T>泛型委托,可以按F12看出該委托返回值類型為bool,同樣我們傳入的匿名方法必須與它具有相同的簽名,所以也要返回bool值。因為總是知道要返回什麼類型的值,所以可以考慮去掉return關鍵字,而方法體裡只有一句表達式,所以可以考慮去掉大括號,同時也將表達式後面多余的分號去掉,到了這個時候原本的方法體已變成i>3這麼個表達式,其等價於一個bool值,可以類比if(i>3)來理解,多個return關鍵字不過是為了返回值以符合方法定義的規范。於是原來的式子又演變成了:

var newlist = list.FindAll(i => i > 3 );

這就是Lambda 表達式。

看了上面的例子或許有人會有這樣的疑惑,=>右邊就只能寫一句表達式,那麼如果我要執行很復雜的邏輯怎麼辦?事實上,可以這樣寫:

List<int> newlist = list.FindAll( (int i) =>//小括號和int可以同時省略,也可以只省略int,不能只省略小括號留int
            {
                //這裡可以寫復雜的邏輯,下面只是示例,當然可以直接return i>3;效果和上面的一樣
                Console.WriteLine("原集合有如下數字:{0}", i);
                bool b = i > 3;
                return b;
            });

之前的例子是因為 =>左邊的參數只有一個才可以省略小括號,實際上,當參數不止一個的時候,則不能省略小括號,例如:(i,j)=>表達式或語句塊

如果沒有參數,可以這樣寫:()=>表達式或語句塊

從匿名方法到Lambda 表達式可以說一個優化演變的過程,Lambda 表達式是一個委托類型,它和匿名方法一樣可以傳遞為委托參數。


C#匿名類型與Lambda表達式?

實話說我也不懂

貌似是3.0的新東西..我參考了下資料

至於 lambda 表達式...

我在MSDN上找到了..
msdn.microsoft.com/zh-cn/library/bb397687.aspx
之前我也只有在python中看到過~~

soft.ccw.com.cn/....shtml
參考資料:soft.ccw.com.cn/....shtml
 

lambda表達式不懂,舉個簡單的例子,再解釋一下,

最大的作用是用在匿名函數和linq查詢上。
這是用在匿名方法上的:
delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
等價於
delegate int del(int i);
del myDelegate = delegate(int i){i=i*i;};
int j = myDelegate(5); //j = 25
至於linq前景不明,就不要深究了。

直接i+1???
呵呵,你是沒碰到一些必須用委托的情況。
比如跨線程調用,你只能用委托,而lambda表達式就是一個很方便的寫法。純粹為了方便而已。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved