Heim > Backend-Entwicklung > C++ > Wie kann ich Lambda-Ausdrücke effizient auf Gleichheit vergleichen?

Wie kann ich Lambda-Ausdrücke effizient auf Gleichheit vergleichen?

Barbara Streisand
Freigeben: 2025-01-03 19:56:38
Original
616 Leute haben es durchsucht

How Can I Efficiently Compare Lambda Expressions for Equality?

Effizienteste Methode zum Testen der Gleichheit von Lambda-Ausdrücken

Problem

Bedenken Sie die Methodensignatur:

public bool AreTheSame<T>(Expression<Func<T, object>> exp1, Expression<Func<T, object>> exp2)
Nach dem Login kopieren

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.

Antwort

public static bool Eq<TSource, TValue>(
    Expression<Func<TSource, TValue>> x,
    Expression<Func<TSource, TValue>> y)
{
    return ExpressionsEqual(x, y, null, null);
}
Nach dem Login kopieren

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.

Implementierungsdetails

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.

Leistung

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.

NuGet-Paket

Der Code ist als NuGet-Paket verfügbar, das kann mit dem folgenden Befehl installiert werden:

Install-Package LambdaCompare
Nach dem Login kopieren

Verwendung

Die Verwendung der Eq-Methode ist unkompliziert:

var f1 = GetBasicExpr1();
var f2 = GetBasicExpr2();
Assert.IsTrue(LambdaCompare.Eq(f1, f2));
Nach dem Login kopieren

Fazit

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage