之前在用
linq to sql
時使用過
「=>」
運算子來進行資料的操作,當時不是很明白這個運算子的**。今天碰到一段**也使用這個運算子,甚是好奇。
這個運算子是
c#3.0
之後才加進來的,是
lambda
運算子,該運算子讀作
」goes to」
。該運算子左邊是輸入的引數,右邊可以是乙個語句也可以是乙個程式塊。
lambda
表示式是用來寫乙個匿名的函式,也可以當作乙個匿名函式傳入到另乙個函式中被其使用。
在介紹lambda
表示式之前,先了解一下在
lambda
出現之前,
c#中是如何將函式作為引數傳遞給方法的。我舉乙個排序的例子來說明這個方法。
named method
在lambda
之前可以使用委託來完成傳遞函式的工作,這個很類似於
c++中的函式指標,但是較之函式指標要安全。以以下排序為例
class
program
;sort(ref numbers, asc);
sort(ref numbers, desc);}//
委託public
static
delegate
bool compare(int i, int j);
//正序比較函式
private
static
bool asc(int i, int j)
//逆序比較函式
private
static
bool desc(int i, int j)
//排序函式
public
static
void sort(ref
int arr, compare cmp)}}
}}上面這段程式中我們將比較函式作為引數傳入排序演算法中,這樣我們就只要寫一段排序演算法就可以同時很方便的實現正序和逆序的運算。這個例子中可能不是很明顯,加入我做的操作不是排序而是篩選,那麼將篩選演算法當作引數傳入就可以很好的提高程式的效率,因為當出現新的過濾規則的時候你只需要寫乙個新的過濾演算法,而不需要實現整個過濾方法。(可以
為例)anonymous methods
如果使用匿名方法,上面的排序方法呼叫就可以修改為。其實就是很坑爹的把委託和那個演算法都寫在了一起。
sort(ref numbers, delegate(int i, int j) );
lambda expression
用lambda
表示式重寫上面的
sort
呼叫,**就變成了:
sort(ref numbers, (i, j) => i >= j );
我們可以發現**變得相對簡單了很多。
lambda stateent
lambda
語句和lambda
表示式的區別就是
lambda
語句有一對
」」,在這個花括號內,你可以幹任何你想幹的事情,如果用
lambda
語句寫上面的
sort
的話,可以寫成寫成下面這樣。
sort(ref numbers, (i, j) =>);
我知道這麼寫很傻,我只是想說明一下這個語句塊內可以寫很多很多的表示式,但是如果表示式多了的話就不像是乙個匿名塊該幹的事情了!
summary
從我這個例子中只是很膚淺的介紹了一下
lambda
這個東西是什麼,你可能會覺得這個東西其實沒什麼用。我認為如果你準備用
lambda
表示式寫的那段程式塊是乙個比較頻繁使用的東西,寫成乙個有名字的會比較好,這樣不僅可以增加程式的可讀性也可以讓**變得比較好維護。這個
lambda
最好的用武之地莫過於在
linq
中,因為很多
linq
語句中的查詢都是很簡單的一兩個表示式,而且關鍵的是他們並沒有特殊的含義也不需要被重用,所以這個
lambda
就可以很好的使用
linq
中的需求。也許微軟就是為了
linq
才在c#
中實現lambda
的吧。reference
lambda
表示式(
c# 程式設計指南):
c# 3.0
特性之lambda
表示式:
C 學習筆記 lambda表示式
在使用委託的時候,除了將乙個已存在的方法賦給乙個委託之外,還可以使用匿名方法的方式。使用匿名方法的時候,需要乙個delegate關鍵字,並且方法的引數列表要和委託定義的完全一樣。這裡有乙個匿名方法 func add delegate int a,int b console.writeline 操作的...
C 學習筆記 lambda表示式
lambda表示式本質上是一種函式,只要掌握了函式的寫法,完全不學lambda表示式也沒問題。但是,既然有lambda表示式,就有它存在的道理。與通常定義的函式相比,lambda表示式其實是一種匿名函式,就是lambda定義的函式沒有名字。與有名字的函式相比,lambda更簡潔,更適合定義一些功能簡...
學習筆記 Lambda表示式
lambda表示式是c 11中的乙個新特性。如果乙個函式物件只需要呼叫一次,還要專門為其編寫乙個類嗎?如果乙個簡單函式只需要呼叫一次,能否在呼叫時才寫出函式體呢?必須可以,這就是lambda所解決的問題。它可以使程式顯得更加簡潔,更加精神。基本形式 外部變數訪問方式說明符 引數 返回值型別 可以不寫...