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

Linq Lambda表達式詳細介紹

編輯:關於.NET

C#3.0有很多值得學習的地方,這裡我們主要介紹Linq查詢,包括介紹Linq Lambda表達式等方面。

C#3.0時代的Linq查詢語句

在C#3.0中我們又有了改善代碼的新工具。

匿名委托很不錯,但是我們希望有更簡單的,更容易維護的代碼。C#3.0提供了Linq Lambda表達式的 概念,你可以把Linq Lambda表達式是我們應用匿名委托的捷徑,下面是用Linq Lambda表達式重寫的查詢 :

static IEnumerable<Employee>
GoldWatch(IEnumerable<Employee> employees) {
return Filter(employees,
  employee => employee.Years>3
);
}

static IEnumerable<Employee>
SalesForce(IEnumerable<Employee> employees) {
return Filter(employees,
employee => employee.Department=="Sales"
);
}

這段代碼相當簡單而且也很容易維護,但還存在一些問題。

◆GoldWatch(employees)

◆SalesForce(employees)

當你看到這樣的調用的時候就會意識到這個問題,從OO的視角來看,我們已經熟悉了noun.verb()這樣 的調用形式,理想情況下,我們希望用這樣的語法能查詢一個集合:

◆employees.GoldWatch()

◆employees.SalesForce()

有人可能會定義一個新的Employee類,它實現了IEnumerable<Employee>。但是問題是,我們的 用戶可能會希望是用別的 IEnumerable<Employee>實現,比如Employee[]和List<Employee> 。

C#3.0用擴展方法(Extension method)解決這個方法:

static IEnumerable<Employee>
Filter(this IEnumerable<Employee> employees, Choose choose) {
foreach (Employee employee in employees) {
if (choose(employee)) {
yield return employee;
}
}
}

static IEnumerable<Employee>
GoldWatch(this IEnumerable<Employee> employees) {
return employees.Filter(employee => employee.Years>3);
}

static IEnumerable<Employee>
SalesForce(this IEnumerable<Employee> employees) {
return employees.Filter(  
employee => employee.Department=="Sales");
}

這看起來很好了,但如果我們想象Employee一樣查詢Customer呢?或者說,查詢我們的存貨呢?

不用為每一個類單獨寫一個Filter方法,我們可以將Filter寫成一個通用函數:

delegate bool Choose<T>(T t);

static IEnumerable<T>
Filter<T>(this IEnumerable<T> items, Choose<T> choose) {
foreach (T item in items) {
if (choose(item)) {
yield return item;
}
}
}

//現在我們可以篩選我們希望的任何類型了!

int [] a = new int [] {1,2,3,4,5};
a.Filter(i => i==1 || i==3);

//這個篩選方法是如此有用且通用,C#裡已經內置了一個稱為Where的實現
//在PDC上展示的實際的Where實現

public delegate T Func<A0, T>(A0 arg0);

public static
IEnumerable<T> Where<T>(this IEnumerable<T> source,
Func<T, bool> predicate) {
foreach (T element in source) {
if (predicate(element)) yield return element;
}
}

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