程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> .NET 3.x新特性之Lambda表達式

.NET 3.x新特性之Lambda表達式

編輯:關於C#

隨著歲月的流逝,VS也從2005慢慢的步入2008,.NET也將進入3.5版本,學習的腳步也要慢慢趕上。今天我們來看看C#3.0的又一特性Lambda表達式,它由2.0代理演化而來,也是為LinQ做好必要的准備。Lambda表達式首先我們要知道他的運算符“=>”,在我以前的一篇文章中可以得到在不同版本中所使用代理和通過Lambda表達式的一個例子,你可以在這裡看到:[C#3.0]新特性概覽.今天我們舉個另外的例子,讓我們更好的理解這個Lambda表達式,因為我們在LinQ中會經常用到這個東東,所以就應該好好看看,況且這也不是什麼難事。

我們在[.NET 3.x新特性一]自動屬性,對象初始化及集合初始化中講到了自動化屬性和集合的初始化,為了講解Lambda表達式我們首先定義一個實體類,代碼如下:

1 public class Person
2 {
3 public string Name { get ; set ; }
4 public string NickName { get ; set ; }
5 public int Age { get ; set ; }
6 }

我們將其初始化一個List列表,並從中獲取Age為23的Person實例和類表中所有實例中Age的平均值。當然其中也用到了擴展方法,這也是屬於LinQ的一個范疇,代碼如下:

1    List<Person> people = new List<Person>
2 {
3 new Person{Name="小兵",NickName="網魂小兵",Age=23},
4 new Person{Name="青青",NickName="QQing",Age=22}
5 };
6 //取得people中Age為23的Person實例。
7 IEnumerable<Person> results = people.Where(p => p.Age == 23);
8 //計算people中的平均歲數。
9 int perAge = people.Average(p => p.Age);

看到Lambda表達式了嗎?p=>p這個就是Lambda表達式,當然Where和Average就是擴展方法,是LinQ的一個擴展方法。當然我們在C#或者說在.NET 2.0中也能夠做到,但是可沒有那麼簡單(其實也不難),下面我們看一下在.NET 2.0中的實現方法:

1 List<Person> people = new List<Person>
2 {
3 new Person{Name="小兵",NickName="網魂小兵",Age=23},
4 new Person{Name="青青",NickName="QQing",Age=22}
5 };
6
7 IEnumerable<Person> results = people.Where(delegate(Person p) { return p.Age == 23; });
8
9 int perAge = people.Sum(delegate(Person p) { return p.Age; });

從上面我們也能夠做到同樣的效果,但是代碼比用Lambda復雜了一點。下面我們看看這種代理方法的擴展是如何實現的呢?首先我們當然是右鍵選擇"轉到定義"就可以看到Where的擴展:

1 public static IEnumerable<TSource> Where<TSource>(
2 this IEnumerable<TSource> source, Func<TSource, bool> predicate);
3public static IEnumerable<TSource> Where<TSource>(
4 this IEnumerable<TSource> source, Func<TSource, int, bool> predicate);

我們來看看Where的代碼:

1 public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source,
2 Func<TSource, bool> predicate)
3 {
4 foreach (TSource s in source)
5 {
6 if (predicate(s))
7 {
8 yield return s;
9 }
10 }
11 }

從上面的代碼中我們可以看出是對IEnumerable的擴展,而predicate是一個Func的代理,Func代理的第二個類型是返回的類型,而第一個類型是參數的類型。如果是Func則最後一個是代理返回的類型(就是這個代理方法執行後的結果),其他都是參數(代理方法的參數,依次排列),就上述代碼而言predicate執行後返回true的就迭代返回實例s。

OK今天就這樣了,這個表達式在LinQ中還會經常用到,讓他在我們的應用和實踐中慢慢深入他。

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