程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> LINQ:開始使用 LINQ(五)- LINQ 中的查詢語法和方法語法,linq語法

LINQ:開始使用 LINQ(五)- LINQ 中的查詢語法和方法語法,linq語法

編輯:C#入門知識

LINQ:開始使用 LINQ(五)- LINQ 中的查詢語法和方法語法,linq語法


開始使用 LINQ(五)- LINQ 中的查詢語法和方法語法

  在表示語言集成查詢 (LINQ) 使用 LINQ 性查詢語法,文檔中的多數查詢編寫。但是,編譯代碼時,必須將查詢語法轉換為方法,這就需要 .NET 公共語言運行時 (CLR)。這些方法調用標准查詢運算符的名稱類似 WhereSelectGroupByJoinMax和 Average。可以調用這些方法直接使用方法語法而不是查詢語法。  

  查詢語法和方法語法語義相同,但是,許多人員發現查詢語法更簡單、更易於閱讀。某些查詢必須表示為方法調用。例如,必須使用方法調用表示檢索元素的數量與指定的條件的查詢。還必須使用方法需要檢索元素的最大值在源序列的查詢。System.Linq 命名空間中的標准查詢運算符的參考文檔通常使用方法語法。

 

一、標准查詢運算符擴展方法

  下面的示例演示簡單的查詢表達式和編寫為基於方法的查詢的語義上等效的查詢。
 1         static void Main(string[] args)
 2         {
 3             var nums = new int[4] { 1, 2, 3, 4 };
 4 
 5             var qureyNums = from n in nums
 6                             where n % 2 == 0
 7                             orderby n descending
 8                             select n;
 9 
10             Console.WriteLine("qureyNums:");
11             foreach (var n in qureyNums)
12             {
13                 Console.WriteLine(n);
14             }
15 
16             var queryNums2 = nums.Where(n => n % 2 == 0).OrderByDescending(n => n);
17             Console.WriteLine("qureyNums2:");
18             foreach (var n in queryNums2)
19             {
20                 Console.WriteLine(n);
21             }
22 
23             Console.Read();
24         }    

 

  兩個示例的輸出是相同的。  您可以看到兩種形式的查詢變量的類型是相同的:IEnumerable<T>。  

  若要了解基於方法的查詢,讓我們進一步地分析它。注意,在表達式的右側,where 子句現在表示為對 numbers 對象的實例方法,在您重新調用該對象時其類型為 IEnumerable<int>。如果您熟悉泛型 IEnumerable<T> 接口,那麼您就會了解,它不具有 Where 方法。但是,如果您在 Visual Studio IDE 中調用 IntelliSense 完成列表,那麼您不僅將看到 Where 方法,而且還會看到許多其他方法,如 SelectSelectManyJoin 和Orderby。下面是所有標准查詢運算符。 

  盡管看起來 IEnumerable<T> 似乎已被重新定義以包括這些附加方法,但事實上並非如此。這些標准查詢運算符都是作為“擴展方法”實現的。

 

二、Lambda 表達式

  在前面的示例中,通知該條件表達式 (num % 2 == 0) 是作為內聯參數。Where 方法:Where(num => num % 2 == 0).此內聯表達式稱為 lambda 表達式。將代碼編寫為匿名方法或泛型委托或表達式樹是一種便捷的方法,否則編寫起來就要麻煩得多。在 C# 中,=> 是 lambda 運算符,可讀為“goes to”。運算符左側的 num 是輸入變量,與查詢表達式中的 num 相對應。編譯器可推斷 num 的類型,因為它了解 numbers 是泛型 IEnumerable<T> 類型。lambda 表達式與查詢語法中的表達式或任何其他 C# 表達式或語句中的表達式相同;它可以包括方法調用和其他復雜邏輯。“返回值”就是表達式結果。    

三、查詢的組合性

  在上面的代碼示例中,請注意 OrderBy 方法是通過在對 Where 的調用中使用點運算符來調用的。Where 生成篩選序列,然後 Orderby 通過對該序列排序來對它進行操作。因為查詢會返回 IEnumerable,所以您可通過將方法調用鏈接在一起,在方法語法中將這些查詢組合起來。這就是在您通過使用查詢語法編寫查詢時編譯器在後台所執行的操作。並且由於查詢變量不存儲查詢的結果,因此您可以隨時修改它或將它用作新查詢的基礎,即使在執行它後。    
 
【來源】本文文字和部分圖片主要摘自微軟官方文檔。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved