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?
Hier wird c =>
verwendet, aber warum?
Was für eine Bedeutung von c =>
. Bitte besprechen Sie ausführlich, weil ich Lambda nicht kenne.
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.)
Nein, Sie müssen nicht einen Lambda-Ausdruck verwenden. Zum Beispiel könnte Ihr Where
-Beispiel wie folgt geschrieben werden:
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.
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.
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.
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:
(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)
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. . . :)