一.Var關鍵字 在學習Linq查詢之前,我們先來學習var關鍵字的用法,看看微軟官方的定義:從Visual C#3.0開始,在方法範圍聲明的變數可以具有隱式“類型” var。隱式類型的局部變數是強類型的,就像您自己聲明瞭類型一樣,但編譯器確定了類型。從這個定義我們有兩點需要註意,首先用var申明的 ...
一.Var關鍵字
在學習Linq查詢之前,我們先來學習var關鍵字的用法,看看微軟官方的定義:從Visual C#3.0開始,在方法範圍聲明的變數可以具有隱式“類型” var
。隱式類型的局部變數是強類型的,就像您自己聲明瞭類型一樣,但編譯器確定了類型。從這個定義我們有兩點需要註意,首先用var申明的隱式類型的局部變數是強類型的,二.var的推斷類型是在編譯的時候確定的,不是在運行的時候。
再看看微軟官方給出的兩個例子:
// Example #1: var is optional when // the select clause specifies a string string[] words = { "apple", "strawberry", "grape", "peach", "banana" }; var wordQuery = from word in words where word[0] == 'g' select word; // Because each element in the sequence is a string, // not an anonymous type, var is optional here also. foreach (string s in wordQuery) { Console.WriteLine(s); }
var
允許使用但不是必需的,因為查詢結果的類型可以明確地表示為IEnumerable<string>
// Example #2: var is required because // the select clause specifies an anonymous type var custQuery = from cust in customers where cust.City == "Phoenix" select new { cust.Name, cust.Phone }; // var must be used because each item // in the sequence is an anonymous type foreach (var item in custQuery) { Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone); }
var
允許結果是匿名類型的集合,除了編譯器本身之外,不能訪問該類型的名稱。使用var
消除了為結果創建新類的要求。
在第二個例子中假如不用var關鍵字的話我們就要事先創建好類,查詢條件一變,查詢結果就跟著改變,又要定義新的類型,linq查詢的條件是隨意變化的,不可能條件一變就聲明新的類型,所以var關鍵字對linq查詢至關重要的。
二.匿名類
創建一個對象一定要先定義這個對象的類型麽,當然不是,我們可以通過匿名類的方式來創建對象,看看下麵這段代碼:
static void Main(string[] args) { string name = "Tom"; int age = 20; var obj = new { name,age }; Console.WriteLine(obj.age.ToString() + obj.name.ToString()); Console.Read(); }
三.Linq查詢
Linq查詢實質是操作集合的一系列擴展方法,Linq特性的核心介面是IEnumerable,只有實現了IEnumerable介面的集合才可以用Linq查詢。
Linq的查詢包含三種方法:
1.使用語法查詢,這種查詢方式和SQL語句比較像:
// Query #1. List<int> objInt = new List<int> { 1, 2, 5, 4, 3, 9, 7, 6, 11, 29, 99 }; var result = from i in objInt where i > 3 && i < 20 orderby i descending select i; foreach (var item in result) { Console.WriteLine(item.ToString()); } Console.Read(); // Query #2. List<string> objListString = new List<string> { "abc", "acd", "bcv", "bcd", "cnh", "ckl", "glk" }; var strResult = from str in objListString group str by str[0]; foreach (var item in strResult) { foreach (var item1 in item) { Console.WriteLine(item1); } } Console.Read(); }
2.使用擴展方法查詢:
某些方法查詢必須表現為方法調用,最常見的此類方法是可返回單一數值的方法,例如 Sum、Max、Min、Average 等。 這些方法在任何查詢中都必須始終最後一個調用,因為它們只表示單個值,不能用作其他查詢操作的源。
擴展方法select的使用:
static void Main(string[] args) { int[] nums = { 1, 7, 2, 6, 5, 4, 9, 13, 20 }; var list = nums.Select(item => item * item); foreach (int item in list) { Console.WriteLine(item); } Console.ReadLine(); }
擴展方法Where的使用:
static void Main(string[] args) { int[] nums = { 1, 7, 2, 6, 5, 4, 9, 13, 20 }; var list = nums .Where(item => item % 2 == 0) .Select(i => i * i); Console.ReadLine(); }
擴展方法orderby的用法:
static void Main(string[] args) { int[] nums = { 1, 7, 2, 6, 5, 4, 9, 13, 20 }; var list = nums .Where(item => item % 2 == 0) .Select(i => i * i) .OrderBy(item => item); foreach (int i in list) { Console.WriteLine(i); } Console.ReadLine(); }
static void Main(string[] args)
{
string[] nums = { "張勇", "王琦", "劉靜", "趙鑫鑫",
"杜麗", "馬俊才", "那英", "成龍", };
var list = nums
.Where(item => item.Length == 2)
.Select(item => item)
.OrderByDescending(item => item.Substring(0, 1));
foreach (string item in list)
{
Console.WriteLine(item);
}
Console.ReadLine();
}
3.結合使用查詢語法和方法語法:
int numCount1 = (from num in numbers1 where num < 3 || num > 7 select num).Count();
由於查詢 返回單個值而不是集合,因此查詢立即執行。