.Net - Lambda 表达式
原文地址 http://news.newhua.com/news1/programming/2007/912/0791210105992GHF3CH3E627648888G.html
隨著歲月的流逝,VS也從2005慢慢的步入2008,.NET也將進入3.5版本,學習的腳步也要慢慢趕上。今天我們來看看C#3.0的又一特性Lambda表達式,它由2.0代理演化而來,也是為LinQ做好必要的準備。Lambda表達式首先我們要知道他的運算符“=>”,在我以前的一篇文章中可以得到在不同版本中所使用代理和通過Lambda表達式的一個例子,你可以在這里看到:[C#3.0]新特性概覽.今天我們舉個另外的例子,讓我們更好的理解這個Lambda表達式,因為我們在LinQ中會經常用到這個東東,所以就應該好好看看,況且這也不是什么難事。
我們在[.NET 3.x新特性一]自動屬性,對象初始化及集合初始化中講到了自動化屬性和集合的初始化,為了講解Lambda表達式我們首先定義一個實體類,代碼如下:
public?? class? Person
{
? public?string?Name {?get ;? set; }
? public?string?NickName {?get ;? set ; }
? public?int?Age {?get;? set ; }
}
我們將其初始化一個List 列表,并從中獲取Age為23的Person實例和類表中所有實例中Age的平均值。當然其中也用到了擴展方法,這也是屬于LinQ的一個范疇,代碼如下:
List < Person >? people? =?? new? List < Person >
{
? new? Person{Name = "Dong" ,NickName = "Boss" ,Age =?80 }
? new? Person{Name = "Max" ,NickName = ".Net Engineer" ,Age = 25 },
? new? Person{Name = "George" ,NickName = "Test Engineer" ,Age = 25 },?
? new? Person{Name = "Jean" ,NickName = "Test Engineer" ,Age =?24 },
? new? Person{Name = "Tommy" ,NickName = "Java Engineer" ,Age =?26 }
};
// 取得people中Age為23的Person實例。
IEnumerable<Person>?results = people.Where(p? =>? p.Age ==?23 );
// 計算people中的平均歲數。
int?perAge?=?(int)people.Average(p =>?p.Age);
?
看到Lambda表達式了嗎?p=>p這個就是Lambda表達式,當然Where和Average就是擴展方法,是LinQ的一個擴展方法。
?
當然我們在C#或者說在.NET 2.0中也能夠做到,但是可沒有那么簡單(其實也不難),下面我們看一下在.NET 2.0中的實現方法:
List <Person>? people? =?? new? List < Person >
{
? new? Person{Name = "Dong" ,NickName = "Boss" ,Age =?80 }
? new? Person{Name = "Max" ,NickName = ".Net Engineer" ,Age = 25 },
? new? Person{Name = "George" ,NickName = "Test Engineer" ,Age = 25 },?
? new? Person{Name = "Jean" ,NickName = "Test Engineer" ,Age =?24 },
? new? Person{Name = "Tommy" ,NickName = "Java Engineer" ,Age =?26 }
};
IEnumerable<Person>?results?=?people.Where(delegate(Person p) { return?p.Age ==?25; });
int? perAge? =? people.Sum( delegate (Person p) {? return? p.Age; });
從上面我們也能夠做到同樣的效果,但是代碼比用Lambda復雜了一點。下面我們看看這種代理方法的擴展是如何實現的呢?首先我們當然是右鍵選擇"轉到定義"就可以看到Where的擴展:
public?static?IEnumerable <TSource>? Where <TSource> (this? IEnumerable <TSource>? source, Func <TSource,? bool>? predicate);
public?static?IEnumerable <TSource>? Where <TSource> (this? IEnumerable <TSource>? source, Func <TSource,? int ,? bool>? predicate);
我們來看看Where的代碼:
public?static?IEnumerable <TSource> Where <TSource> (this? IEnumerable <TSource>? source,Func <TSource,? bool>? predicate)
{
? foreach? (TSource s? in? source)
? {
??? if(predicate(s))
??? {
????? yield? return? s;
??? }
? }
}
從上面的代碼中我們可以看出是對IEnumerable的擴展,而predicate是一個Func 的代理,Func代理的第二個類型是返回的類型,而第一個類型是參數的類型。如果是Func 則最后一個是代理返回的類型(就是這個代理方法執行后的結果),其他都是參數(代理方法的參數,依次排列),就上述代碼而言predicate執行后返回true的就迭代返回實例s。
OK今天就先記這么多 ^_^
轉載于:https://www.cnblogs.com/yoshow/archive/2007/11/23/969856.html
總結
以上是生活随笔為你收集整理的.Net - Lambda 表达式的全部內容,希望文章能夠幫你解決所遇到的問題。