Lambda 運算式
最近在研究CRM的Accelerator時,在他的程式片段中看到了這樣的程式:
context.Subjects.First(s => ((subject)s).title == SiteContext.Current.Website.GetSiteSettingValueByName("case/subject")).Id;
………我第一個反應是 "=>" 是甚麼鬼= =…
從程式碼猜測他會回傳一個符合後面的條件集合的樣子…
好吧~估狗一下:
= =…………………。不鬧了。
「Lambda 運算式」(Lambda Expression) 是一種匿名函式,它可以包含運算式和陳述式 (Statement),而且可以用來建立委派 (Delegate) 或運算式樹狀架構型別。
所有的 Lambda 運算式都會使用 Lambda 運算子 =>,意思為「移至」。Lambda 運算子的左邊會指定輸入參數 (如果存在),右邊則包含運算式或陳述式區塊。
基本上這個運算式都會透過委派來做~
實際來看一下,第一種:
陳述式 Lambda~
(input parameters) => {statement;}
簡單來說就是將左邊的參數移至右邊的陳述式內。簡單測一下~
private void button1_Click(object sender, EventArgs e)
{
TestLambda test = c =>
{
string str = c + " GOD";
MessageBox.Show(str);
};
test("OH~~");
}
上面這段來看,就等於委派傳入的參數~所以呼叫委派後就會
執行後面那段陳述式,結果:
第二種。
具有標準查詢運算子的 Lambda
許多標準查詢運算子,都具有型別為一種 Func<T, TResult> 系列泛型委派的輸入參數。Func<T, TResult> 委派使用型別參數來定義輸入參數的數目和型別,以及委派的傳回型別。對於封裝套用至一組來源資料中每個項目的使用者定義運算式,Func 委派是非常有用的。
Func的委派型別:
public delegate TResult Func<TArg0, TResult>(TArg0 arg0)
直接看網頁上的例子:
bool result = myFunc(4);
傳入值為int,會回傳一個bool值。在=>後面的運算式就必須要回傳布林值。因此這個例子會傳回false。
再以網頁上的例子為例:
int oddNumbers = numbers.Count(n => n % 2 == 1);
這裡為一個陣列的Count方法,裡面帶入Func的委派,
Cout的方法中會將陣列中的的值放到這個Func內進行運算,
最後回傳符合條件的項目個數。
最後看這個也搞懂了~不過這是CRM的東西,就不在這講了囧~
context.Subjects.First(s => ((subject)s).title == SiteContext.Current.Website.GetSiteSettingValueByName("case/subject")).Id;