隨著歲月的流逝,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中還會經常用到,讓他在我們的應用和實踐中慢慢深入他。