方法 : 匿名型を射影する

短期間しか使用しないことがわかっている新しい型にクエリを射影することが必要になる場合があります。単に射影で使用するために新しい型を作成するのは大きな負担です。この場合は、匿名型に射影する方法が効率的です。匿名型を使用すると、クラス名を指定することなくクラスを定義し、そのクラスのオブジェクトを宣言して初期化できます。

匿名型とは、タプルの数学的概念を C# で実装したものです。組という数学用語は、1 タプル、2 タプル、3 タプル、4 タプル、5 タプル、n タプルという数列に基づいています。組とは、それぞれが特定の型を持つオブジェクトの有限のシーケンスを意味します。名前と値のペアの一覧と呼ばれることもあります。たとえば、「一般的な購買発注書」という XML ドキュメントでは、住所の内容が次のように表現されます。

Name: Ellen Adams
Street: 123 Maple Street
City: Mill Valley
State: CA
Zip: 90952
Country: USA

匿名型のインスタンスを作成するときは、注文 n のタプルを作成すると考えると簡単です。select 句でタプルを作成するクエリを記述すると、そのクエリからタプルの IEnumerable が返されます。

使用例

この例では、select 句で匿名型を射影しています。さらに、var を使用して IEnumerable オブジェクトを作成しています。foreach ループ内では、繰り返し変数が、クエリ式で作成された匿名型のインスタンスになります。

この例では、「サンプル XML ファイル : 顧客と注文 (LINQ to XML)」の 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

関連項目

概念

射影と変換 (LINQ to XML)