Bedenken Sie die Methodensignatur:
public bool AreTheSame<T>(Expression<Func<T, object>> exp1, Expression<Func<T, object>> exp2)
Wie kann Können Sie effizient feststellen, ob zwei Lambda-Ausdrücke gleich sind? Diese Methode sollte nur einfache Ausdrücke verarbeiten, insbesondere MemberExpressions in der Form c => c.ID.
public static bool Eq<TSource, TValue>( Expression<Func<TSource, TValue>> x, Expression<Func<TSource, TValue>> y) { return ExpressionsEqual(x, y, null, null); }
Diese Methode vergleicht die Ausdrücke, indem sie sie in ihre Bestandteile zerlegt und jeden Teil einzeln vergleicht. Es wird kein vollständiger AST-Vergleich durchgeführt, sondern stattdessen werden alle konstanten Ausdrücke reduziert und ihre Werte direkt verglichen.
Die Implementierung der ExpressionsEqual-Methode vergleicht rekursiv die verschiedenen Teile der Ausdrücke. Wenn es sich bei den Ausdrücken beispielsweise um MemberExpressions handelt, wird die Member-Eigenschaft jedes Ausdrucks verglichen. Wenn es sich um BinaryExpressions handelt, werden die Eigenschaften Method, Left und Right verglichen.
Die Methode behandelt Sonderfälle wie ConditionalExpressions und NewArrayExpressions. Es behandelt auch Fälle, in denen die Ausdrücke unterschiedliche Typen haben, einschließlich anonymer Typen.
Die Leistung dieser Methode ist deutlich besser als ein vollständiger AST-Vergleich, insbesondere für Ausdrücke, die konstante Werte enthalten. Dadurch eignet es sich für Anwendungsfälle wie die Scheinvalidierung, bei denen der Lambda-Ausdruck auf lokale Variablen verweisen kann, die nach Wert verglichen werden sollen.
Der Code ist als NuGet-Paket verfügbar, das kann mit dem folgenden Befehl installiert werden:
Install-Package LambdaCompare
Die Verwendung der Eq-Methode ist unkompliziert:
var f1 = GetBasicExpr1(); var f2 = GetBasicExpr2(); Assert.IsTrue(LambdaCompare.Eq(f1, f2));
Diese effiziente Methode zum Vergleichen von Lambda-Ausdrücken bietet eine bequeme und leistungsstarke Möglichkeit, ihre Gleichheit zu bestimmen. Dies ist besonders nützlich in Szenarien, in denen lokale Variablenwerte verglichen werden müssen.
Das obige ist der detaillierte Inhalt vonWie kann ich Lambda-Ausdrücke effizient auf Gleichheit vergleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!