Поделиться через


Как выполнить проекцию нового типа (LINQ to XML)

В других примерах данного раздела показаны запросы, возвращающие результаты в виде значений IEnumerable<T> типа XElement, значений IEnumerable<T> типа string и значений IEnumerable<T> типа int. Это наиболее распространенные типы результатов, но подходят не для всех сценариев. Во многих случаях требуется, чтобы запросы возвращали 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

В данном примере используется метод M:System.Xml.Linq.XElement.Element, представленный в разделе Как извлечь отдельный дочерний элемент (LINQ to XML). В нем также используется приведение для получения значений элементов, возвращаемых методом M:System.Xml.Linq.XElement.Element.

Этот пример выводит следующие данные:

Lawnmower:1
Baby Monitor:2

См. также

Основные понятия

Проекции и преобразования (LINQ to XML)