支援 LINQ 的 C# 功能

查詢運算式

查詢運算式使用類似 SQL 或 XQuery 的宣告式語法來查詢 System.Collections.Generic.IEnumerable<T> 集合。 在編譯時間,查詢語法會轉換成對 LINQ 提供者實作的標準查詢方法進行的方法呼叫。 應用程式使用 using 指示詞來指定適當的命名空間,藉此控制範圍內的標準查詢運算子。 下列查詢運算式會擷取字串的陣列,然後根據字串的第一個字元分組字串,再排序這些群組。

var query = from str in stringArray
            group str by str[0] into stringGroup
            orderby stringGroup.Key
            select stringGroup;

隱含型別變數 (var)

您可以使用 var 修飾元來指示編譯程式推斷並指派類型,如下所示:

var number = 5;
var name = "Virginia";
var query = from str in stringArray
            where str[0] == 'm'
            select str;

宣告為 var 的變數和明確指定類型的變數一樣具有強型別。 var 可用來建立匿名型別,但僅適用於區域變數。 如需詳細資訊,請參閱隱含型別區域變數

物件和集合初始設定式

物件和集合初始設定式可以初始化物件,而不需要明確呼叫物件的建構函式。 初始設定式通常會用於將來源資料投影為新資料類型的查詢運算式中。 假設有個名為 Customer 的類別具有公用的 NamePhone 屬性,則可如下列程式碼所示使用物件初始設定式:

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 填滿的 System.Collections.Generic.IEnumerable<T>,這正是您所需要的。 上述範例也可以使用 LINQ 的方法語法撰寫:

var newLargeOrderCustomers = IncomingOrders.Where(x => x.OrderSize > 5).Select(y => new Customer { Name = y.Name, Phone = y.Phone });

從 C# 12 開始,您可以使用集合運算式來初始化集合。

如需詳細資訊,請參閱

匿名類型

編譯程式會建構匿名型別。 型別名稱僅適用於編譯程式。 匿名型別提供了一個便利的方法,暫時將查詢結果中的一組屬性分組,而不需要另外定義具名類型。 匿名型別是以新的運算式和物件初始設定式進行初始化,如下所示:

select new {name = cust.Name, phone = cust.Phone};

從 C# 7 開始,您可以使用 Tuple 來建立未命名的型別。

擴充方法

擴充方法是一種可以與類型相關聯的靜態方法,因此可以像呼叫類型上的執行個體方法一樣呼叫它。 這項功能實際上可讓您「新增」方法至現有的類型,而不需要實際修改這些類型。 標準查詢運算子是一組擴充方法,可為實作 IEnumerable<T> 的任何類型提供 LINQ 查詢功能。

Lambda 運算式

Lambda 運算式是一種內嵌函式,其使用 => 運算子分隔輸入參數與函式主體,而且可以在編譯期間轉換成委派或運算式樹狀架構。 在 LINQ 程式設計中,當您直接對標準查詢運算子進行方法呼叫時,就會遇到 Lambda 運算式。