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.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für