LINQ(Language Integrated Query)(2):預備知識,擴充方法,Lambda

來源:互聯網
上載者:User
文章目錄
  • 通過擴充方法和Lambda實現通過select,where關鍵字實現的功能

擴充方法,Lambda跟Linq一樣是C#3.0出現的新特性.擴充方法和Lambda(拉姆達運算式)在Linq中使用得很多,但也可以不依託Linq在其他地方獨立使用.比如Lambda在委託和事件中就用得多.

擴充方法

擴充,顧名思義就是在原有的基礎上增加些啥東東.和部分類別達到的效果有點類似.我們知道定義class時在前面加個partial,則可以在分開的幾個檔案中編寫類的代碼.編譯時間會合并成一個類.擴充方法就是你在其他任何地方定義個跟某個類相關聯的靜態方法後(當然和一般的方法文法有一點點區別,另外也不是真的任何地方,必須是定義在某個靜態類中),就相當給原來的類新增加了一個方法.其實我們也可以通過繼承一個類,新增一個函數達到類似的目的.只不過這樣太麻煩了點,而且有些類是sealed的,不能繼承.

舉個簡單例子,我們知道string類中沒有Add(string str)這個方法,我們就來弄個擴充方法.讓string類擁有這方法

public static class ExtensionMethods

{

 /*下面的方法就是所謂的擴充方法了.跟一般方法非常類似.只不過裡面有個this關鍵字,this後面出現哪個類就表示這方法跟哪個類關聯.

this string str表示此方法跟string類關聯,str在這裡不能當作普通方法中函數參數來看待.它在定義時必不可少.但在函數體中可以用至它也可以不用.另外str只是個參數名,你自然可以隨便取名.除開this string str這個地方有點奇怪外.其他地方完全跟一般方法一樣.你可以隨便添加多少參數.*/

    public static string Add(this string str,string addStr)

        {

            return str + addStr;

           //如果不用str,也可以這樣寫return addStr

        }

}

有了上面的定義後你在其他任何用到string類的地方都能使用這函數了

比如

string str = "Hello ";

string newStr =  str.Add("arwen");

 

實際上我們自己寫代碼時用到擴充方法的時候不多.不過要是你開發第三方控制項,擴充VS裡面看到的那些控制項的功能時肯定會大量使到擴充方法

另外Linq寫好了很多擴充方法讓我們可以去調用.你在命名空間System.Linq下的靜態函數Enumerable中會看到很多擴充方法

於是你在引用了Linq命名空間後使用數組時會看到多出了Any,All這些奇怪的方法.

 

Lambda運算式

 

Lambda運算式本來是數學中的一個術語.在C#中代表的意思我們可以理解為把一個函數表示成有點像數學中的函數的形式.在數學中我們會看到 y = f(x)這樣的函數.x表示變數,

y是傳回值.我們以前在C#中要實現這樣類似的功能往往是先在哪定義個函數,然後再去調用它.但現在可以直接使用函數,不用先定義再去調用.舉個簡單例子看下

Func<int, int, int> fun =

                                    (a, b) => a * b;

            int one = 4;

            int two = 5;

            int y = fun(one, two);

Func是一個預定義好的代理,這裡我們給代理綁定一個函數.但我們不用先在其他地方定義個函數,然後再使用那函數名來調用.直接來個(a,b) =>a*b;它就是所謂的Lambda表示式了.其實就相當於是一個函數,形式比較簡單,而且可以直接拿來用了.其實它也 就是個更簡單的匿名方法.我們也可以用delegate關鍵字來表示一個匿名方法.比如上面的Lambda運算式等價於

Func<int, int, int> fun =

                delegate(int a, int b) { return a * b; };       //這個是匿名方法

 

再來說下Lambda的格式:

以=>做為分界線(一個等號加大於符號,中間不能空格),前面的部分是參數,後面是函數體.(a,b)=>a*b;只是個簡寫形式,它的完整形式應該是

(int a,int b) => {return a*b;};

//一般情況下括弧中的參數的類型都可以省略.因為通過前面的代理的參數類型可以推斷出來.但如果要顯式寫上類型的話所有的參數就必須同時都寫上

如果寫成(int a,b)就錯了.

 

通過擴充方法和Lambda實現通過select,where關鍵字實現的功能

 

string[] names = { "arwen", "james", "sunny", "lily", "ada" };

  var name   = from na in names

                         where na.StartsWith("a")

                         select na;

假如有這樣的語句.則它和下面的語句等價.

var myName = names.Where(str => str.StartsWith("a"));

 

至於你兩種形式你喜歡用哪一種憑你自己的愛好.我覺得通過select,where這樣的關鍵字應該是更直觀點

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.