如何:投影新类型 (LINQ to XML)

本节中的其他示例已演示了一些查询,这些查询以 XElementIEnumerable<T>、string 的 IEnumerable<T> 和 int 的 IEnumerable<T> 的形式返回结果。 这些是常见结果类型,但它们不是对所有情况都适用。 在很多情况下,会希望查询返回其他类型的 IEnumerable<T>

示例

此示例演示如何在 select 子句中实例化对象。 代码首先定义一个具有一个构造函数的新类,然后修改 select 语句,使该表达式成为新类的新实例。

本示例使用下面的 XML 文档:示例 XML 文件:典型采购订单 (LINQ to XML)

class NameQty {
    public string name;
    public int qty;
    public NameQty(string n, int q)
    {
        name = n;
        qty = q;
    }
};

class Program {
    public static void Main() {
        XElement po = XElement.Load("PurchaseOrder.xml");

        IEnumerable<NameQty> nqList =
            from n in po.Descendants("Item")
            select new NameQty(
                    (string)n.Element("ProductName"),
                    (int)n.Element("Quantity")
                );

        foreach (NameQty n in nqList)
            Console.WriteLine(n.name + ":" + n.qty);
    }
}
Public Class NameQty
    Public name As String
    Public qty As Integer
    Public Sub New(ByVal n As String, ByVal q As Integer)
        name = n
        qty = q
    End Sub
End Class

Public Class Program
    Shared Sub Main()
        Dim po As XElement = XElement.Load("PurchaseOrder.xml")

        Dim nqList As IEnumerable(Of NameQty) = _
            From n In po...<Item> _
            Select New NameQty( _
                n.<ProductName>.Value, CInt(n.<Quantity>.Value))

        For Each n As NameQty In nqList
            Console.WriteLine(n.name & ":" & n.qty)
        Next
    End Sub
End Class

本示例使用主题如何:检索单个子元素 (LINQ to XML)中介绍的 M:System.Xml.Linq.XElement.Element 方法。 还使用强制转换来检索 M:System.Xml.Linq.XElement.Element 方法返回的元素值。

此示例产生以下输出:

Lawnmower:1
Baby Monitor:2

请参见

概念

投影和转换 (LINQ to XML)