LINQ 和泛型型別 (C#)
LINQ 查詢是以 .NET Framework 2.0 版中就引進的泛型型別為基礎。 您不需要對泛型型別有相當程度的了解,就可以開始撰寫查詢。 不過,您可能需要了解兩個基本概念:
建立泛型集合類別 (Class) (如 List<T>) 的執行個體 (Instance) 時,請將 "T" 取代為清單中會包含之物件的型別。 例如,字串的清單是以 List<string> 表示,而 Customer 物件的清單則是以 List<Customer> 表示。 泛型清單是強型別的,而且優點多於以 Object 形式儲存項目的集合。 如果您嘗試將 Customer 加入至 List<string>,就會在編譯時期接收到錯誤。 泛型集合不需要執行執行階段的型別轉換 (Type Cast),因此十分容易使用。
IEnumerable<T> 這個介面可讓您使用 foreach 陳述式來列舉泛型集合類別。 就像 ArrayList 等非泛型集合類別支援 IEnumerable,泛型集合類別同樣可以支援 IEnumerable<T>。
如需泛型的詳細資訊,請參閱泛型 (C# 程式設計手冊)。
LINQ 查詢中的 IEnumerable<T> 變數
LINQ 查詢變數的型別是 IEnumerable<T> 或諸如 IQueryable<T> 之類的衍生型別 (Derived Type)。 當您看到型別為 IEnumerable<Customer> 的查詢變數時,只表示查詢在執行時會產生由零個以上 Customer 物件組成的序列。
IEnumerable<Customer> customerQuery =
from cust in customers
where cust.City == "London"
select cust;
foreach (Customer customer in customerQuery)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
如需詳細資訊,請參閱LINQ 查詢作業中的型別關聯性 (C#)。
讓編譯器處理泛型型別宣告
想要的話,您可以使用 var 關鍵字來避免使用泛型語法。 var 關鍵字會指示編譯器 (Compiler) 查看 from 子句中指定的資料來源,來推斷查詢變數的型別。 下列範例在編譯後會產生與上一個範例相同的程式碼:
var customerQuery2 =
from cust in customers
where cust.City == "London"
select cust;
foreach(var customer in customerQuery2)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
var 關鍵字適用於當變數的型別很明顯,或不需要明確指定巢狀泛型型別 (如群組查詢產生的型別) 時。 一般而言,如果要使用 var,則建議您考慮到它會讓其他人更難看懂您的程式碼。 如需詳細資訊,請參閱隱含型別區域變數 (C# 程式設計手冊)。