這篇文章主要介紹了LINQ有哪些強大功能,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
LINQ,即Language Integrated Query。很多人熟悉SQL語言,用它來操作數據庫非常方便?,F在在C#3.0中也可以使用相同的語法來操作各種數據,包括數組,文件,數據庫等。由于LINQ的東西比較多,本文主要介紹LINQ。
下面看一個例子,程序員就應該拿代碼說話:
class Program ...{ static void Main(string[] args) ...{ string[] names=...{"Everett", "Albert", "George", "Harris", "David" }; var items=from name in names where name.Length>=6 orderby name select name.ToUpper(); foreach(var item in items) Console.WriteLine(item); } }
是不是對上面的from,where,orderby等單詞很熟悉,我們可以很輕松的像查詢數據庫一樣查詢某些數組。其實上述表達式等價于下面這樣的寫法:
var items=names.Where(name=>name.Length>=6).
OrderBy(name=>name).Select(name=>name.ToUpper());
那么我們為什么能在數組上應用這些方法呢,本來數組上沒有這些方法???回憶一下我們原來說過的內容,擴展方法,對,我們在這里看到擴展方法的用武之地了。而且我們也看到了Lambda表達式的應用使得語句更加簡潔,易懂。這些擴展方法定義在哪里呢?我們可以在System.LINQ這個程序集里面看到這樣的定義:
namespace System.LINQ ...{ public static class Enumerable ...{ public static IEnumerable<T> Where<T>( this IEnumerable<T> source, Func<T, bool> predicate) ...{ foreach (T item in source) if (predicate(item) } yield return item; } } }
這里我們可以清晰的看到許多this關鍵字,這些正是擴展方法的標志。若果我們對Lambda表達式不是很熟悉的化,上面的LINQ語句還可以進一步轉化成委托的形式。
Func<string, bool> filter = delegate (string s) ...{return s.Length >=6;}; Func<string, string> extract = delegate (string s) ...{return s; }; Func<string, string> project = delegate (string s) ...{return s.ToUpper(); }; var items = names.Where(filter) .OrderBy(extract) .Select(project);
有一個問題,我們會注意到items前面是用var做它的類型,那么有沒有提出這樣的疑問,這個var到底是什么類型呢?我們仔細看一下那個System.LINQ程序集,就會發現擴轉方法返回的是IEnumerable<T>類型,一個泛型接口,沒錯var就是這個泛型接口。還有一個問題就是當names滿足什么條件時,我們可以應用LINQ表達式進行查詢。這一點還要從那個程序集上仔細觀察。我們會發現有一個source參數,根據擴展方法的語法我們知道這個source參數就是調用了這個方法的對象。那么我們可以推斷出這個對象要能轉換成IEnumerable<T>。那什么類型可以成功轉換呢?很顯然只要實現了 IEnumerable<T>這個泛型接口的類型都可以轉換。譬如數組類型,List<T>,等等。當我們還可以自己定義類型只要實現了這個接口就可以用LINQ對這個類型進行操作。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“LINQ有哪些強大功能”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。