LINQ und generische Typen (C#)LINQ and Generic Types (C#)

LINQLINQ-Abfragen basieren auf generischen Typen, die mit Version 2.0 von .NET Framework.NET Framework eingeführt wurden. queries are based on generic types, which were introduced in version 2.0 of the .NET Framework.NET Framework. Sie benötigen kein ausführliches Wissen über Generika, um Abfragen schreiben zu können.You do not need an in-depth knowledge of generics before you can start writing queries. Dennoch sollten Sie zwei grundlegende Konzepte verstehen:However, you may want to understand two basic concepts:

  1. Wenn Sie eine Instanz einer generischen Auflistungsklasse wie etwa List<T> erstellen, ersetzen Sie das „T“ durch den Objekttyp, den die Liste enthalten wird.When you create an instance of a generic collection class such as List<T>, you replace the "T" with the type of objects that the list will hold. Eine Liste von Zeichenfolgen wird z.B. als List<string> und eine Liste von Customer-Objekten als List<Customer> ausgedrückt.For example, a list of strings is expressed as List<string>, and a list of Customer objects is expressed as List<Customer>. Eine generische Liste ist stark typisiert und hat gegenüber Auflistungen, die ihre Elemente als Object speichern, viele Vorzüge.A generic list is strongly typed and provides many benefits over collections that store their elements as Object. Wenn Sie versuchen einen Customer in eine List<string> einzufügen, erhalten Sie zur Laufzeit eine Fehlermeldung.If you try to add a Customer to a List<string>, you will get an error at compile time. Es ist sehr leicht, generische Auflistungen zu verwenden, da Sie keine Laufzeitumwandlung von Typen durchführen müssen.It is easy to use generic collections because you do not have to perform run-time type-casting.

  2. IEnumerable<T> ist die Schnittstelle, die es ermöglicht, dass generische Auflistungsklassen mithilfe der Anweisung foreach aufgelistet werden.IEnumerable<T> is the interface that enables generic collection classes to be enumerated by using the foreach statement. Generische Auflistungsklassen unterstützen IEnumerable<T>, während nicht generische Auflistungsklassen, wie etwa ArrayList, IEnumerable unterstützen.Generic collection classes support IEnumerable<T> just as non-generic collection classes such as ArrayList support IEnumerable.

Weitere Informationen zu Generika finden Sie unter Generika.For more information about generics, see Generics.

IEnumerable<T>-Variablen in LINQ-AbfragenIEnumerable<T> variables in LINQ Queries

Die Abfragevariablen LINQLINQ werden als IEnumerable<T> typisiert oder als ein abgeleiteter Typ, wie z.B. IQueryable<T>.LINQLINQ query variables are typed as IEnumerable<T> or a derived type such as IQueryable<T>. Wenn Sie eine Abfragevariable des Typs IEnumerable<Customer> sehen, bedeutet dies nur, dass die Abfrage bei der Ausführung eine Folge von null oder mehr Customer-Objekten produziert.When you see a query variable that is typed as IEnumerable<Customer>, it just means that the query, when it is executed, will produce a sequence of zero or more Customer objects.

IEnumerable<Customer> customerQuery =
    from cust in customers
    where cust.City == "London"
    select cust;

foreach (Customer customer in customerQuery)
{
    Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}

Weitere Informationen finden Sie unter Typbeziehungen in LINQ-Abfragevorgängen.For more information, see Type Relationships in LINQ Query Operations.

Verarbeiten von generischen Typdeklaration durch den CompilerLetting the Compiler Handle Generic Type Declarations

Falls Sie dies möchten, können Sie generische Syntax umgehen, indem Sie das Schlüsselwort var verwenden.If you prefer, you can avoid generic syntax by using the var keyword. Das Schlüsselwort var weist den Compiler an, den Typ der Abfragevariablen abzuleiten, indem er sich an der in der from-Klausel angegebenen Datenquelle orientiert.The var keyword instructs the compiler to infer the type of a query variable by looking at the data source specified in the from clause. Das folgende Beispiel erstellt den gleichen kompilierten Code wie das vorherige Beispiel:The following example produces the same compiled code as the previous example:

var customerQuery2 = 
    from cust in customers
    where cust.City == "London"
    select cust;

foreach(var customer in customerQuery2)
{
    Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}

Das Schlüsselwort var ist nützlich, wenn der Typ der Variablen offensichtlich ist, oder wenn es nicht so wichtig ist, die geschachtelten generischen Typen explizit festzulegen, wie z.B. diejenigen, die in Gruppenabfragen erstellt werden.The var keyword is useful when the type of the variable is obvious or when it is not that important to explicitly specify nested generic types such as those that are produced by group queries. Allgemein wird darauf hingewiesen, dass das Verwenden von var das Lesen Ihres Codes durch andere erschwert.In general, we recommend that if you use var, realize that it can make your code more difficult for others to read. Weitere Informationen zu finden Sie unter Implizit typisierte lokale Variablen.For more information, see Implicitly Typed Local Variables.

Siehe auchSee Also

Erste Schritte mit LINQ in C#Getting Started with LINQ in C#
GenerikaGenerics