HOW TO:規劃匿名型別
在某些情況下,即使您知道您只會短期使用新型別,您可能還是想要將查詢規劃為該型別。 建立新型別只用於這個規劃太費工。 在此情況下,較有效率的方法為規劃匿名型別。 匿名型別可讓您定義類別,然後宣告並初始化該類別的物件,而不用提供類別一個名稱。
匿名型別為「Tuple」之數學概念的 C# 實作。 數學術語「Tuple」源自於 single、double、triple、quadruple、quintuple、n-tuple 序列。 這表示有限的物件順序,每個都有特定的型別。 有時候,這稱為成對的名稱/值清單。 例如,在典型採購訂單 XML 文件中的地址內容無法如下表示:
Name: Ellen Adams
Street: 123 Maple Street
City: Mill Valley
State: CA
Zip: 90952
Country: USA
當您建立匿名型別的執行個體時,將它視為建立順序 n 的 Tuple 比較方法。 如果您撰寫可在 select 子句中建立 Tuple 的查詢,該查詢會傳回 Tuple 的 IEnumerable。
範例
在這個範例中,select 子句會規劃匿名型別。 然後,此範例會使用 var 來建立 IEnumerable 物件。 在 foreach 迴圈中,反覆運算變數會變成在查詢運算式中建立之匿名型別的執行個體。
此範例使用下列 XML 文件:XML 範例檔:客戶和訂單 (LINQ to XML)。
XElement custOrd = XElement.Load("CustomersOrders.xml");
var custList =
from el in custOrd.Element("Customers").Elements("Customer")
select new {
CustomerID = (string)el.Attribute("CustomerID"),
CompanyName = (string)el.Element("CompanyName"),
ContactName = (string)el.Element("ContactName")
};
foreach (var cust in custList)
Console.WriteLine("{0}:{1}:{2}", cust.CustomerID, cust.CompanyName, cust.ContactName);
Dim custOrd As XElement = XElement.Load("CustomersOrders.xml")
Dim custList = _
From el In custOrd.<Customers>.<Customer> _
Select New With { _
.CustomerID = el.@<CustomerID>, _
.CompanyName = el.<CompanyName>.Value, _
.ContactName = el.<ContactName>.Value _
}
For Each cust In custList
Console.WriteLine("{0}:{1}:{2}", cust.CustomerID, cust.CompanyName, cust.ContactName)
Next
此程式碼會產生下列輸出:
GREAL:Great Lakes Food Market:Howard Snyder
HUNGC:Hungry Coyote Import Store:Yoshi Latimer
LAZYK:Lazy K Kountry Store:John Steel
LETSS:Let's Stop N Shop:Jaime Yorres