.Net - Lambda 表达式
原文地址 http://news.newhua.com/news1/programming/2007/912/0791210105992GHF3CH3E627648888G.html
隨著歲月的流逝,VS也從2005慢慢的步入2008,.NET也將進(jìn)入3.5版本,學(xué)習(xí)的腳步也要慢慢趕上。今天我們來(lái)看看C#3.0的又一特性Lambda表達(dá)式,它由2.0代理演化而來(lái),也是為L(zhǎng)inQ做好必要的準(zhǔn)備。Lambda表達(dá)式首先我們要知道他的運(yùn)算符“=>”,在我以前的一篇文章中可以得到在不同版本中所使用代理和通過(guò)Lambda表達(dá)式的一個(gè)例子,你可以在這里看到:[C#3.0]新特性概覽.今天我們舉個(gè)另外的例子,讓我們更好的理解這個(gè)Lambda表達(dá)式,因?yàn)槲覀冊(cè)贚inQ中會(huì)經(jīng)常用到這個(gè)東東,所以就應(yīng)該好好看看,況且這也不是什么難事。
我們?cè)赱.NET 3.x新特性一]自動(dòng)屬性,對(duì)象初始化及集合初始化中講到了自動(dòng)化屬性和集合的初始化,為了講解Lambda表達(dá)式我們首先定義一個(gè)實(shí)體類,代碼如下:
public?? class? Person
{
? public?string?Name {?get ;? set; }
? public?string?NickName {?get ;? set ; }
? public?int?Age {?get;? set ; }
}
我們將其初始化一個(gè)List 列表,并從中獲取Age為23的Person實(shí)例和類表中所有實(shí)例中Age的平均值。當(dāng)然其中也用到了擴(kuò)展方法,這也是屬于LinQ的一個(gè)范疇,代碼如下:
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實(shí)例。
IEnumerable<Person>?results = people.Where(p? =>? p.Age ==?23 );
// 計(jì)算people中的平均歲數(shù)。
int?perAge?=?(int)people.Average(p =>?p.Age);
?
看到Lambda表達(dá)式了嗎?p=>p這個(gè)就是Lambda表達(dá)式,當(dāng)然Where和Average就是擴(kuò)展方法,是LinQ的一個(gè)擴(kuò)展方法。
?
當(dāng)然我們?cè)贑#或者說(shuō)在.NET 2.0中也能夠做到,但是可沒(méi)有那么簡(jiǎn)單(其實(shí)也不難),下面我們看一下在.NET 2.0中的實(shí)現(xiàn)方法:
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復(fù)雜了一點(diǎn)。下面我們看看這種代理方法的擴(kuò)展是如何實(shí)現(xiàn)的呢?首先我們當(dāng)然是右鍵選擇"轉(zhuǎn)到定義"就可以看到Where的擴(kuò)展:
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);
我們來(lái)看看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;
??? }
? }
}
從上面的代碼中我們可以看出是對(duì)IEnumerable的擴(kuò)展,而predicate是一個(gè)Func 的代理,Func代理的第二個(gè)類型是返回的類型,而第一個(gè)類型是參數(shù)的類型。如果是Func 則最后一個(gè)是代理返回的類型(就是這個(gè)代理方法執(zhí)行后的結(jié)果),其他都是參數(shù)(代理方法的參數(shù),依次排列),就上述代碼而言predicate執(zhí)行后返回true的就迭代返回實(shí)例s。
OK今天就先記這么多 ^_^
轉(zhuǎn)載于:https://www.cnblogs.com/yoshow/archive/2007/11/23/969856.html
總結(jié)
以上是生活随笔為你收集整理的.Net - Lambda 表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。