程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> LINQ(Language Integrated Query)(2):預備知識,擴展方法,Lambda

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

編輯:C#入門知識

擴展方法,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  www.2cto.com

                         where na.StartsWith("a")

                         select na;

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

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

 作者:weiwenhp

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