Lambda 運算式

Lambda 運算式

最近在研究CRM的Accelerator時,在他的程式片段中看到了這樣的程式:

context.Subjects.First(s => ((subject)s).title == SiteContext.Current.Website.GetSiteSettingValueByName("case/subject")).Id;

 

………我第一個反應是   "=>" 是甚麼鬼= =…

從程式碼猜測他會回傳一個符合後面的條件集合的樣子…

好吧~估狗一下:

image

= =…………………。不鬧了。

微軟的MSDN說明

 

「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~~");
        }

上面這段來看,就等於委派傳入的參數~所以呼叫委派後就會

執行後面那段陳述式,結果:

image

 

第二種。

具有標準查詢運算子的 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的委派,

image 

Cout的方法中會將陣列中的的值放到這個Func內進行運算,

最後回傳符合條件的項目個數。

 

最後看這個也搞懂了~不過這是CRM的東西,就不在這講了囧~

context.Subjects.First(s => ((subject)s).title == SiteContext.Current.Website.GetSiteSettingValueByName("case/subject")).Id;