C#3.0新增功能09 LINQ 基礎08 支援 LINQ 的 C# 功能
- 2019 年 10 月 4 日
- 筆記
查詢表達式
查詢表達式使用類似於 SQL 或 XQuery 的聲明性語法來查詢 IEnumerable 集合。 在編譯時,查詢語法轉換為對 LINQ 提供程式的標準查詢運算符擴展方法實現的方法調用。 應用程式通過使用 using 指令指定適當的命名空間來控制範圍內的標準查詢運算符。 下面的查詢表達式獲取一個字元串數組,按字元串中的第一個字元對字元串進行分組,然後對各組進行排序。
var query = from str in stringArray group str by str[0] into stringGroup orderby stringGroup.Key select stringGroup;
有關詳細資訊,請參閱 LINQ 查詢表達式。
隱式類型化變數 (var)
可以使用 var 修飾符來指示編譯器推斷並分配類型,而不必在聲明並初始化變數時顯式指定類型,如下所示:
var number = 5; var name = "Virginia"; var query = from str in stringArray where str[0] == 'm' select str;
聲明為 var 的變數與顯式指定其類型的變數一樣都是強類型。 通過使用 var,可以創建匿名類型,但它只能用於本地變數。 也可以使用隱式類型聲明數組。
有關詳細資訊,請參閱隱式類型局部變數。
對象和集合初始值設定項
通過對象和集合初始值設定項,初始化對象時無需為對象顯式調用構造函數。 初始值設定項通常用在將源數據投影到新數據類型的查詢表達式中。 假定一個類名為 Customer,具有公共 Name 和 Phone 屬性,可以按下列程式碼中所示使用對象初始值設定項:
var cust = new Customer { Name = "Mike", Phone = "555-1212" };繼續我們的 Customer 類,假設有一個名為 IncomingOrders 的數據源,並且每個訂單具有一個較大的 OrderSize,我們希望基於該訂單創建新的 Customer。 可以在此數據源上執行 LINQ 查詢,並使用對象初始化來填充集合:
var newLargeOrderCustomers = from o in IncomingOrders where o.OrderSize > 5 select new Customer { Name = o.Name, Phone = o.Phone };數據源可能具有比 Customer 類更多的屬性,例如 OrderSize,但執行對象初始化後,從查詢返回的數據被定型為所需的數據類型;我們選擇與我們的類相關的數據。 因此,我們現在有填充了我們想要的多個新 Customer 的 IEnumerable。 上述程式碼也可以使用 LINQ 的方法語法編寫:
var newLargeOrderCustomers = IncomingOrders.Where(x => x.OrderSize > 5).Select(y => new Customer { Name = y.Name, Phone = y.Phone });匿名類型
匿名類型由編譯器構造,且類型名稱只可用於編譯器。 匿名類型提供一種在查詢結果中對一組屬性臨時分組的簡便方法,無需定義單獨的命名類型。 使用新的表達式和對象初始值設定項初始化匿名類型,如下所示:
select new {name = cust.Name, phone = cust.Phone};有關詳細資訊,請參閱匿名類型。
擴展方法
擴展方法是一種可與類型關聯的靜態方法,因此可以像實例方法那樣對類型調用它。 實際上,利用此功能,可以將新方法「添加」到現有類型,而不會實際修改它們。 標準查詢運算符是一組擴展方法,它們為實現 IEnumerable<T> 的任何類型提供 LINQ 查詢功能。
有關詳細資訊,請參閱擴展方法。
Lambda 表達式
Lambda 表達式是一種內聯函數,該函數使用 => 運算符將輸入參數與函數體分離,並且可以在編譯時轉換為委託或表達式樹。 在 LINQ 編程中,在對標準查詢運算符進行直接方法調用時,會遇到 lambda 表達式。
有關詳細資訊,請參見: