1. 程式人生 > >LINQ 初步了解

LINQ 初步了解

col 字符串 con 列表 lock 要求 方法 保存 express

.NET Framework 3.5的新特性 Language Integrated Query,即語言集成查詢 查詢 和語言結合
關系數據庫裏的信息
使用的XML文檔
保存在本地的DataSet
內存中的List列表

LINQ中最基本的數據單元是sequences和elements。
一個sequence是實現了IEnumerable<T>的對象,而一個element是sequence中的每一個元素。
如下,字符串數組就是一個sequence,數組中單個元素則是elements。

查詢運算符:用來轉換sequence的方法。一個典型的查詢運算符接收一個輸入sequence並輸出一個轉換之後的sequence。在System.Linq.Enumerable類中,總共定義了40來個查詢運算符----全部用擴展方法來實現,他們被稱

為標準查詢運算符。

一個查詢則是由查詢運算符來轉換sequence的一個表達式,最簡單的查詢由一個input sequence和一個查詢運算符組成。
string[] names = { "Tom", "Dick", "Harry" };

// 獲取所有長度大於等於4的名字
IEnumerable<string> filteredNames = System.Linq.Enumerable.Where(
names, n => n.Length >= 4);

foreach (string n in filteredNames)
Console.WriteLine(n);

因為查詢運算符是以擴展方法實現的,所以我們可以直接在names對象上調用Where:

// 獲取所有長度大於等於4的名字
IEnumerable<string> filteredNames = names.Where(n => n.Length >= 4);

我們可以通過使用var關鍵字來進一步簡寫我們的query:

var filteredNames = names.Where(n => n.Length >= 4);
註:在初學LINQ時,var關鍵字可能會影響可讀性,特別是在沒有IDE和智能提示的時候,因而如果可能,我會在本系列的開始盡量使用確切的返回類型。

大部分查詢運算符都接受一個lambda表達式作為參數,lambda表達式決定了查詢的行為特性和結果。在上例中,lambda表達式為:

n => n.Length >= 4
Lambda表達式格式為:(parameters) => expression-or-statement-block

在這裏的lambda表達式中,輸入參數n對應了names數組的每一個元素,其類型為string。Where運算符要求lambda表達式返回一個bool值,當結果為true時,表示該元素會包含在輸出sequence中。這裏是Where運算符的方法簽
名:

public static IEnumerable<TSource> Where<TSource>
(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
下面的query獲取所有包含字母a的名字:

string[] names = { "Tom", "Dick", "Harry" };
IEnumerable<string> filteredNames = names.Where(n => n.Contains("a"));

foreach (string name in filteredNames)
Console.WriteLine(name); // Harry

到現在為止,我們通過使用擴展方法和lambda表達式來建立了LINQ query。我們很快就能看到,這種策略非常的靈活和適合query的創建,因為我們可以級聯的使用查詢運算符。通常,這種方法被稱為LINQ方法語法(英文著作
中稱為fluent syntax)。C#還提供了另外一種書寫query的語法,叫做查詢表達式語法(英文著作中稱為query expression syntax),下面是一個用查詢表達式語法建立的query,讓我們先睹為快:

IEnumerable<string> filteredNames = from n in names
where n.Contains("a")
select n; // Harry
方法語法和查詢表達式語法是互為補充的

LINQ 初步了解