C#-Funktionen mit LINQ-Unterstützung

Abfrageausdrücke

Abfrageausdrücke verwenden eine deklarative Syntax wie SQL oder XQuery, um eine Abfrage über System.Collections.Generic.IEnumerable<T>-Sammlungen zu erstellen. Zur Kompilierzeit wird die Abfragesyntax in Methodenaufrufe in eine Implementierung des LINQ-Anbieters der Standardabfragemethoden konvertiert. Applikationen steuern die Standardabfrageoperatoren, die sich durch Angabe des entsprechenden Namespace mit einer using-Anweisung innerhalb des Bereichs befinden. Der folgende Abfrageausdruck nimmt ein Array von Zeichenfolgen, gruppiert sie nach dem ersten Zeichen in der Zeichenfolge und sortiert die Gruppen.

var query = from str in stringArray
            group str by str[0] into stringGroup
            orderby stringGroup.Key
            select stringGroup;

Implizit typisierte Variablen (var)

Sie können den var-Modifizierer verwenden, um den Compiler zum Ableiten und Zuweisen des Typs anzuweisen, wie hier gezeigt:

var number = 5;
var name = "Virginia";
var query = from str in stringArray
            where str[0] == 'm'
            select str;

Variablen, die als var deklariert werden, sind ebenso stark typisiert wie Variablen, deren Typ Sie explizit angeben. Die Verwendung von var macht es möglich, anonyme Typen zu erstellen, jedoch nur für lokale Variablen. Weitere Informationen finden Sie unter Implizit typisierte lokale Variablen.

Objekt- und Auflistungsinitialisierer

Objekt- und Auflistungsinitialisierer ermöglichen das Initialisieren von Objekten ohne expliziten Aufruf eines Konstruktors für das Objekt. Initialisierer werden in der Regel in Abfrageausdrücken verwendet, wenn sie die Quelldaten in einen neuen Datentyp projizieren. In einer Klasse namens Customer mit öffentlichen Name- und Phone-Eigenschaften können Objektinitialisierer wie im folgenden Code verwendet werden:

var cust = new Customer { Name = "Mike", Phone = "555-1212" };

Wenn Sie mit der Customer-Klasse fortfahren, gehen Sie davon aus, dass eine Datenquelle namens IncomingOrders vorhanden ist und dass für jede Bestellung mit einem großen OrderSize-Wert ein neues Customer-Element basierend auf dieser Bestellung erstellt werden soll. Eine LINQ-Abfrage kann auf dieser Datenquelle ausgeführt werden und verwendet die Objektinitialisierung, um eine Auflistung zu füllen:

var newLargeOrderCustomers = from o in IncomingOrders
                            where o.OrderSize > 5
                            select new Customer { Name = o.Name, Phone = o.Phone };

Für die Datenquelle können mehr Eigenschaften definiert sein als für die Klasse Customer, z. B. OrderSize, aber bei der Objektinitialisierung werden die von der Abfrage zurückgegebenen Daten in den gewünschten Datentyp umgewandelt. Wählen Sie die Daten aus, die für Ihre Klasse relevant sind. Daher verfügen Sie jetzt über ein System.Collections.Generic.IEnumerable<T>-Element, das mit den neuen gewünschten Customer-Informationen gefüllt ist. Das obige Beispiel kann auch in der Methodensyntax von LINQ geschrieben werden:

var newLargeOrderCustomers = IncomingOrders.Where(x => x.OrderSize > 5).Select(y => new Customer { Name = y.Name, Phone = y.Phone });

Ab C# 12 können Sie einen Sammlungsausdruck verwenden, um eine Sammlung zu initialisieren.

Weitere Informationen finden Sie unter:

Anonyme Typen

Der Compiler erstellt einen anonymen Typ. Der Typname ist nur für den Compiler verfügbar. Anonyme Typen stellen eine bequeme Möglichkeit zum vorübergehenden Gruppieren einer Reihe von Eigenschaften in einem Abfrageergebnis bereit, ohne einen separaten benannten Typ definieren zu müssen. Anonyme Typen werden mit einem neuen Ausdruck und einem Objektinitialisierer initialisiert, wie hier gezeigt:

select new {name = cust.Name, phone = cust.Phone};

Ab C# 7 können Sie Tupel verwenden, um unbenannte Typen zu erstellen.

Erweiterungsmethoden

Eine Erweiterungsmethode ist eine statische Methode, die einem Typ zugeordnet werden kann, sodass sie aufgerufen werden kann, als ob es sich um eine Instanzmethode für den Typ handeln würde. Diese Funktion ermöglicht es Ihnen, neue Methoden zu vorhandenen Typen „hinzuzufügen“, ohne sie tatsächlich zu ändern. Die Standardabfrageoperatoren sind eine Reihe von Erweiterungsmethoden, die LINQ-Abfragefunktionen für jeden Typ bieten, der IEnumerable<T> implementiert.

Lambda-Ausdrücke

Ein Lambdaausdruck ist eine Inlinefunktion, die den Operator => verwendet, um Eingabeparameter vom Funktionstext zu trennen, und die zur Kompilierzeit in einen Delegaten oder eine Ausdrucksbaumstruktur konvertiert werden kann. In der LINQ-Programmierung erhalten Sie Lambdaausdrücke, wenn Sie direkte Methodenaufrufe für die Standardabfrageoperatoren vornehmen.