Gewusst wie: Projizieren eines neuen Typs (LINQ to XML)
Aktualisiert: November 2007
In anderen Beispielen dieses Abschnitts wurden Abfragen gezeigt, die Ergebnisse als eine IEnumerable<T> von XElement, eine IEnumerable<T> von string und eine IEnumerable<T> von int zurückgeben. Dabei handelt es sich zwar um gängige Ergebnistypen, die sich aber nicht für jedes Szenario eignen. In vielen Fällen besteht Ihr Ziel darin, dass Ihre Abfragen als eine IEnumerable<T> eines anderen Typs zurückgegeben werden.
Beispiel
In diesem Beispiel wird gezeigt, wie Sie Objekte in der select-Klausel instanziieren können. Der Code definiert zuerst mit einem Konstruktor eine neue Klasse und ändert anschließend die select-Anweisung so, dass der Ausdruck zu einer neuen Instanz der neuen Klasse wird.
In diesem Beispiel wird das XML-Dokument in XML-Beispieldatei: Typischer Auftrag (LINQ to XML) verwendet.
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
Dieses Beispiel verwendet die M:System.Xml.Linq.XElement.Element-Methode, die im Thema Gewusst wie: Abrufen eines einzelnen untergeordneten Elements (LINQ to XML) eingeführt wurde. Außerdem verwendet das Beispiel Umwandlungen, um die Werte der Elemente abzurufen, die von der M:System.Xml.Linq.XElement.Element-Methode zurückgegeben werden.
Dieses Beispiel führt zur folgenden Ausgabe:
Lawnmower:1
Baby Monitor:2