Mit den Abfrageverständnisfunktionen der C # -Compiler können Sie Code wie folgt schreiben:
var names = new string[] { "Dog", "Cat", "Giraffe", "Monkey", "Tortoise" };
var result =
from animalName in names
let nameLength = animalName.Length
where nameLength > 3
orderby nameLength
select animalName;
Im obigen Abfrageausdruck let
ermöglicht das Schlüsselwort die Weitergabe eines Werts an die Operationen where und orderby ohne doppelte Aufrufe an animalName.Length
.
Was ist der äquivalente Satz von LINQ-Erweiterungsmethodenaufrufen, mit denen erreicht wird, was das Schlüsselwort "let" hier bewirkt?
c#
linq
extension-methods
linq-to-objects
LBushkin
quelle
quelle
Antworten:
Let hat keine eigene Operation; es huckepack weg von
Select
. Sie können dies sehen, wenn Sie "Reflektor" verwenden, um eine vorhandene DLL auseinander zu ziehen.es wird so etwas sein wie:
quelle
.Dump()
Erweiterungsmethode in LinqPad verwenden, um das resultierende Lambda zu sehen.Es gibt einen guten Artikel hier
Erstellt im Wesentlichen
let
ein anonymes Tupel. Es ist äquivalent zu:quelle
it seems prudent to recommend against using the let keyword in cases where you do not need to transform a variable
This could be considered a micro-optimisation
Es gibt auch eine .Let-Erweiterungsmethode in System.Interactive, deren Zweck jedoch darin besteht, einen Lambda-Ausdruck einzuführen, der in einem fließenden Ausdruck "inline" ausgewertet werden soll. Betrachten Sie beispielsweise (in LinqPad beispielsweise) den folgenden Ausdruck, der bei jeder Ausführung neue Zufallszahlen erstellt:
Beachten Sie Folgendes, um zu sehen, dass jedes Mal neue Zufallsstichproben angezeigt werden
das erzeugt Paare, in denen links und rechts unterschiedlich sind. Gehen Sie wie folgt vor, um Paare zu erzeugen, bei denen links und rechts immer gleich sind:
Wenn wir Lambda-Ausdrücke direkt aufrufen könnten, könnten wir schreiben
Wir können jedoch keine Lambda-Ausdrücke aufrufen, als wären sie Methoden.
quelle
Informationen zu Code, der dem Schlüsselwort 'let' in verketteten LINQ-Erweiterungsmethodenaufrufen entspricht
Der obige Kommentar ist nicht mehr gültig
produziert
so mehrere
let
sind jetzt optimiertquelle