前面提到在C#2.0中,我們用一個delegate關鍵字匿名地調用了一個委托方法,簡化了程序員的工作,但同時我們也發覺程序的可讀性降低了不少。下面我用一個例子來說明Lambda表達式是如何增強代碼的可讀性的。
還是以上面的UserInfo查詢作為例子,下面的代碼同樣取出年齡在20-35之間的用戶群。
var result1 = infoList.FindAll(p => (p.age > 20 && p.age < 35));
這裡僅僅只用了一行代碼就完成了查詢,是不是很神奇呢!我們來分析一下這句話的語義:首先是調用了infoList的FindAll方法,這個方法的原型如下:
// Summary:
// Retrieves all the elements that match the conditions defined by the specifIEd predicate.
//
// Parameters:
// match:
// The System.Predicate<T> delegate that defines the conditions of the elements
// to search for.
//
public List<T> FindAll(Predicate<T> match);
由於篇幅原因,我刪掉一部分注解,大家可以注意到它的參數Predicate<T>毫無疑問是一個委托類型,這就證明了我們前面所說的Lambda表達式確實是一個委托的簡化。接著在參數中第一個字母是p,指示了我們返回的數據,這裡編譯器可以通過前面infoList的類型判斷出p的類型來。下面是指示符”=>”,表示返回的數據集合要符合後面的查詢條件。
這裡再舉一個復雜一點的例子加以說明:
var groupBooksNumAndClicks =
from book in books.Tbl_books
from type in books.Tbl_types
where book.Type_id == type.Id
group book by type.Name into g
select new { type = g.Key, booksSum = g.Count(), clicksSum = g.Sum(p => p.Clicks) };
如果大家還有印象的話,這是我以前在介紹LINQ語言時寫的一個數據庫查詢的例子,Tbl_books這張表包含了書籍的所有信息(書名,價格,等等),Tbl_types這張表包含了所有的書籍目錄(比如數學類,計算機類等等), 我們要取出相同類別的書籍並計算每一類書籍總的點擊量,有興趣的朋友可以自行研究一下。