Lambda-Ausdruckssyntax

7

Ist es zwingend erforderlich, dass Lambda-Ausdruck verwendet werden muss, wenn LINQ verwendet wird, oder sind Lambda-Ausdrücke optional?

In Lambda-Ausdrücken wird immer das Zeichen => verwendet. Was heißt das?

%Vor%

Hier wird c => verwendet, aber warum? Was für eine Bedeutung von c => . Bitte besprechen Sie ausführlich, weil ich Lambda nicht kenne.

    
Thomas 22.02.2011, 18:37
quelle

7 Antworten

7

Der Lambda-Ausdruck

%Vor%

ist Abkürzung für etwas wie

%Vor%

Es ist nur eine sehr prägnante Art, eine einfache Funktion zu schreiben, die einen Wert zurückgibt. Sie wird als "anonyme Funktion" bezeichnet, da ihr niemals ein Name oder eine formale Definition zugewiesen wurde (die Parametertypen und der Rückgabetyp werden aus dem Kontext abgeleitet).

(Eigentlich ist es nicht nur Kurzschrift; Lambda-Ausdrücke sind mit einigen anderen Konstrukten verwandt, die Verschlüsse , die sehr coole und mächtige Werkzeuge sind.)

    
Jeremy Todd 22.02.2011, 18:42
quelle
11

Nein, Sie müssen nicht einen Lambda-Ausdruck verwenden. Zum Beispiel könnte Ihr Where -Beispiel wie folgt geschrieben werden:

%Vor%

Das geht natürlich von LINQ zu Objects. Für LINQ to SQL usw. müssten Sie eine Ausdrucksstruktur erstellen.

Warum "= & gt;" wird immer in einem Lambda-Ausdruck verwendet, einfach deshalb, weil der Operator so geschrieben ist - es ist, als würde man fragen, warum "+" für die Addition verwendet wird.

Ein Lambda-Ausdruck von "c = & gt; ..." gibt dem Lambda-Ausdruck effektiv einen -Parameter namens c ... in diesem Fall liefert die generische Typinferenz den -Typ von c . Der Hauptteil bietet entweder eine auszuführende Aktion oder eine Berechnung, um einen Wert basierend auf c zurückzugeben.

Eine ausführliche Beschreibung von Lambda-Ausdrücken ist nicht Gegenstand dieser Antwort. Als krasser Plug-In für mein Buch werden sie jedoch ausführlich in Kapitel 9 von C # behandelt.

    
Jon Skeet 22.02.2011 18:40
quelle
4

Denken Sie über lambdas als anonyme Funktionen nach. Ich werde versuchen, es mit folgendem Code zu erklären.

%Vor%

Nun entfernen wir den Funktionsnamen und entfernen Klammern:

%Vor%

Wir brauchen keinen Rückgabetyp, weil der Compiler den Typ aus Ausdruck ableiten kann:

%Vor%

Auf dieselbe Weise weiß der Compiler über den Eingabetyp, so dass wir ihn nicht spezifizieren müssen.

Also im Grunde genommen ist

%Vor%

Und Lambda-Syntax in c # ist im Grunde:

%Vor%

Sie können auch "mehrzeilige" Ausdrücke schreiben, aber dann müssen Sie Ihren Code mit geschweiften Klammern umgeben. Außerdem müssen Sie die Anweisung "return" verwenden, wie Sie es normalerweise tun.

    
ionoy 22.02.2011 18:49
quelle
1

Jon hat bereits geantwortet, aber ich möchte das hinzufügen.

In dem Beispiel, das Sie gegeben haben, stellen Sie sich vor, dass Linq alle Kunden durchläuft, und c ist einfach eine Referenz auf jedes Element in der Aufzählung:

%Vor%

Es ist eine Variable wie jede andere, es muss kein einziger sein, aber es ist nur eine Art Konvention.

    
TimothyP 22.02.2011 18:44
quelle
1

Sie müssen keine Lambda-Ausdrücke auf LInq zu SQL oder Entities verwenden; Hier ist eine alternative Art Ihres Codes;

Sie Code:

%Vor%

anders herum;

%Vor%

Das ist der andere Weg. es liegt an dir.

    
tugberk 22.02.2011 18:46
quelle
1

Lambda und linq sind ziemlich getrennt. Sie können einen verwenden, ohne den anderen zu verwenden (es gibt Teile von linq, die von Lambda-Ausdrücken abhängen, aber wir wollen es einfach halten :-))

  

Ein Lambda-Ausdruck ist anonym   Funktion, die Ausdrücke enthalten kann   und Aussagen, und kann verwendet werden   Erstellen Sie Delegaten oder Ausdrucksbaum   Typen.

Das war von MSDN. (http://msdn.microsoft.com/en-us/library/bb397687.aspx)

Um es kurz zu machen (es ist viel komplexer) können Sie einen Lambda-Ausdruck verwenden, um eine lokale Funktion zu erstellen. was du vor die = & gt; (In Ihrem Beispiel ist das c) der Parameter der Funktion. Der Rückgabetyp wird vom C # -Compiler "entdeckt".

c => c.City == "London" entspricht fast:

%Vor%

(Der Unterschied ist, dass einige Lambda-Ausdrücke Delegaten und auch Ausdrücke sind, aber bitte ignorieren Sie dies, Sie werden es für einige Zeit nicht brauchen)

Wenn der Compiler nicht in der Lage ist, die Typen der Parameter abzuleiten, können Sie sie erzwingen: (MyObject p) => p.SomeProperty != null . Hier sagen Sie dem Compiler, dass p ein Parameter ist.

Während ich hier gezeigt habe, was man "expression lambdas" nennt, kann man sogar "statement lambdas" sagen:

%Vor%

(Ich werde Ihnen nicht sagen, was die Unterschiede zwischen den Lambda-Ausdrücken und den Lambda-Anweisungen sind. Wenn Sie sie kennen wollen, lesen Sie die msdn-Seite, auf die ich bereits hingewiesen habe)

    
xanatos 22.02.2011 18:42
quelle
1

Nein, das ist überhaupt nicht nötig.

Wir haben zwei Möglichkeiten, LINQ-Abfragen zu schreiben.

Eins ist eine Abfragemethode und andere ist eine Builder-Methode. Sie müssen nur den Lambda-Ausdruck für die Builder-Methode angeben. Zum Beispiel, wenn wir alle Schüler von einigen Schülern suchen möchten, die mehr als 70 Punkte haben. aber wir können diese Sache in LINQ mit folgender Syntax tun

%Vor%

oder        var data = stdList.Where (p = & gt; p.marks & gt; 70);

später Ansatz ist Builder-Methode, in Where-Funktion übergeben wir Lambda-Ausdrücke.

Lambda-Ausdrücke sind nur Abkürzungen, mit denen Sie immer LINQ-Abfragen verwenden können. Wenn Sie jedoch die ganze Abfragesyntax für einfache Bedingungen vermeiden möchten, können Sie einfach die LINQ-Builder-Methoden (die nach Lambda-Ausdrücken fragen) in Lambda-Ausdrücken verwenden definieren Sie immer einen Alias ​​und führen dann Ihre Operation aus.

Soweit = & gt; Betreiber ist betroffen, es funktioniert genau wie Zuweisungsoperator. Zum Beispiel:

%Vor%

In der Literatur wird dies "Prädikat" genannt. Eine andere Literaturterminologie ist "Projection"

%Vor%

Dies ist eine Projektion, es verwendet einen ternären Operator. Obwohl ich mit sehr einfachen Beispielen erklärt habe, hoffe ich, dass dir das helfen würde. . . :)

    
Madiha Khalid 04.03.2011 14:19
quelle

Tags und Links