Linq Lambda表達(dá)式詳細(xì)介紹
C#3.0有很多值得學(xué)習(xí)的地方,這里我們主要介紹Linq查詢,包括介紹Linq Lambda表達(dá)式等方面。
C#3.0時代的Linq查詢語句
在C#3.0中我們又有了改善代碼的新工具。
匿名委托很不錯,但是我們希望有更簡單的,更容易維護(hù)的代碼。C#3.0提供了Linq Lambda表達(dá)式的概念,你可以把Linq Lambda表達(dá)式是我們應(yīng)用匿名委托的捷徑,下面是用Linq Lambda表達(dá)式重寫的查詢:
- 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"
- );
- }
這段代碼相當(dāng)簡單而且也很容易維護(hù),但還存在一些問題。
◆GoldWatch(employees)
◆SalesForce(employees)
當(dāng)你看到這樣的調(diào)用的時候就會意識到這個問題,從OO的視角來看,我們已經(jīng)熟悉了noun.verb()這樣的調(diào)用形式,理想情況下,我們希望用這樣的語法能查詢一個集合:
◆employees.GoldWatch()
◆employees.SalesForce()
有人可能會定義一個新的Employee類,它實現(xiàn)了IEnumerable<Employee>。但是問題是,我們的用戶可能會希望是用別的 IEnumerable<Employee>實現(xiàn),比如Employee[]和List<Employee>。
C#3.0用擴(kuò)展方法(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寫成一個通用函數(shù):
- 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;
- }
- }
- }
- //現(xiàn)在我們可以篩選我們希望的任何類型了!
- int [] a = new int [] {1,2,3,4,5};
- a.Filter(i => i==1 || i==3);
- //這個篩選方法是如此有用且通用,C#里已經(jīng)內(nèi)置了一個稱為Where的實現(xiàn)
- //在PDC上展示的實際的Where實現(xiàn)
- 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;
- }
- }
【編輯推薦】