1、LINQ特有的編程結構
隱式類型本地變量:C#的var關鍵字允許定義不顯式指定實際數據類型的本地變量。不過由於編譯器將根據初始值推斷其數據類型,所有該變量仍然是強類型的。
對象和集合初始化語法:它允許我們在創建類或結構變量的同時設置其屬性。
Lambda表達式:C#Lambda操作符(=>)可以用來構建Lambda表達式,並且在調用以強類型的委托作為參數的方法時,也十分有用。
擴展方法:C#擴展方法不使用子類就能夠像已知類中添加新的功能。同樣,它還可以向不能有子類的密封類和結構中添加新的功能。在編寫擴展方法時,第一個參數必須使用this限定符,用來表示被擴展的類型。擴展方法只能定義在靜態類中,並且必須使用static關鍵字聲明為靜態方法。
匿名類型:該特性可以快速建立數據的“結構”,編譯器將根據名稱/值對的結合在編譯時生成新的類。該類型是基於值的語義構建的,因此System.object中的每個虛方法都要重寫。要定義一個匿名類型,可以聲明一個隱式類型變量,並使用對象初始化語法指定數據的結構。
2、LINQ查詢表達式是強類型的(跟傳統的SQL語句有所不同)。
3、核心LINQ程序集
System.Core.dll:定義了代表核心LINQ API的類型;
System.Data.DataSetExtensions.dll:定義了許多類型來將ADO.NET類型融入LINQ變成范式;
System.Xml.Linq.dll:提供了使用LINQ處理XML文檔數據所需的功能。
4、將LINQ查詢應用於原始數組
1 static void Main(string[] args)
2 {
3 QueryOverStrings();
4 Console.ReadLine();
5 }
6
7 static void QueryOverStrings()
8 {
9 //假定我們有一個字符串數組
10 string[] currentVideoGames = { "Morrowind", "Uncharted2", "Fallout 3", "Daxter", "System Shock 2" };
11
12 //構建一個查詢表達式,來代表數組中有一個空格的項
13 IEnumerable<string> subset = from g in currentVideoGames where g.Contains(" ") orderby g select g;
14
15 //輸出結果
16 foreach (string s in subset)
17 Console.WriteLine(s);
18 }
一般來說,在獲取LINQ查詢的結果集時,應該總是使用隱式類型。但要記住的是,在絕大多數情況下,真正的返回值是實現了泛型IEnumerable<T>接口的類型。
static void QueryOverInts()
{
int[] numbers = { 10, 20, 30, 40, 1, 2, 3, 8};
//只輸出小於10的項
//使用隱式類型
var subset = from i in numbers where i < 10 select i;
foreach (var i in subset)
Console.WriteLine(i);
ReflectOverQueryResults(subset);
}
5、LINQ和擴展方法:雖然System.Array並沒有直接實現IEnumerable<T>接口,但它通過靜態的System.Linq.Enumerable類類型間接地得到了該類型所需的功能,同時還得到了許多其他的與LINQ相關成員。
6、延遲執行的作用:有關LINQ查詢表達式另一個重要的地方是在我們迭代內容之前,它們不會真正進行運算,嚴格的說叫做延遲執行。這個方式的好處在於可以為相同的容器多次應用相同的LINQ查詢,而始終可以獲得最新的最好的結果。
1 static void QueryOverInts()
2 {
3 int[] numbers = { 10, 20, 30, 40, 1, 2, 3, 8};
4
5 //只輸出小於10的項
6 //使用隱式類型
7 var subset = from i in numbers where i < 10 select i;
8
9 foreach (var i in subset)
10 Console.WriteLine(i);
11 Console.WriteLine();
12
13 //修改一些數據
14 numbers[0] = 4;
15
16 //再一次運算
17 foreach (var j in subset)
18 Console.WriteLine(j);
19 Console.WriteLine();
20
21 ReflectOverQueryResults(subset);
22 }
7、立即執行的作用:如果希望foreach邏輯外部運算LINQ表達式,可以調用由Enumerable類型定義的許多擴展方法來完成。Enumerable定義了諸如ToArray<T>()、ToDictionary<TSource,TKey>()以及ToList<T>()在內的許多擴展方法。在調用這些方法的同時將執行LINQ查詢,以獲取數據快照。然后這些數據快照就可以獨立進行操作了:
1 static void ImmediateExecution()
2 {
3 int[] numbers = { 10, 20, 30, 40, 1, 2, 3, 8 };
4
5 //立即獲取數據為int[]
6 int[] subsetAsIntArray =
7 (from i in numbers where i < 10 select i).ToArray();
8
9 //立即獲取數據為List<int>
10 List<int> subsetAsListOfInts =
11 (from i in numbers where i < 10 select i).ToList();
12 }
整個LINQ表達式用圓括號括起來,這樣就能將它強制轉換為正確的實際類型來調用Enumerable的擴展方法。C#編譯器可以准確檢測泛型項的類型參數,我們不需要指定類型參數。
8、返回LINQ查詢的結果
9、將查詢應用到集合對象
10、C#LINQ查詢操作符