Effizienter Vergleich der Gleichheit von Lambda-Ausdrücken
Herausforderung:
Gegebene Methodensignatur:
public bool AreTheSame<T>(Expression<Func<T, object>> exp1, Expression<Func<T, object>> exp2)
Nach dem Login kopieren
Bestimmen Sie die effektivste Methode, um festzustellen, ob die beiden Ausdrücke äquivalent sind. Diese Auswertung sollte nur einfache MemberExpressions wie c => unterstützen. c.ID.
Vorgeschlagene Lösung:
Eine optimierte Version von Marcs Code, die Arrays, neue Operatoren und mehr unterstützt, wird unten vorgestellt. Es verwendet eine elegantere Methode zum Vergleichen von ASTs.
public static class LambdaCompare
{
public static bool Eq<TSource, TValue>(
Expression<Func<TSource, TValue>> x,
Expression<Func<TSource, TValue>> y)
{
return ExpressionsEqual(x, y, null, null);
}
...
private static bool ExpressionsEqual(Expression x, Expression y, LambdaExpression rootX, LambdaExpression rootY)
{
...
}
...
}
Nach dem Login kopieren
Detaillierte Erklärung:
- Dieser Code prüft vorher anhand der Referenz, ob die beiden Ausdrücke gleich sind Sie werden Wert für Wert verglichen.
- Es wird bewertet, ob es sich bei beiden um konstante Ausdrücke handelt, und wenn ja, wird deren Wert bestimmt Werte.
- Wenn die Ausdrücke nicht vom gleichen Typ sind, gibt die Funktion „false“ zurück.
- Bei Lambda-Ausdrücken vergleicht sie die Parameter und den Hauptteil der Ausdrücke.
- Für Mitglieder Ausdrücke vergleicht es das Mitglied und den zugrunde liegenden Ausdruck.
- Bei binären Ausdrücken vergleicht es die Methode, den linken Ausdruck und den rechten Ausdruck.
- Bei unären Ausdrücken vergleicht es die Methode und den Operanden.
- Bei Parameterausdrücken vergleicht es deren Indizes in den Parameterlisten.
- Bei Methodenaufrufausdrücken vergleicht es vergleicht die Methode, das Objekt und die Argumente.
- Bei Member-Init-Ausdrücken werden der neue Ausdruck und das Member verglichen Bindungen.
- Bei neuen Array-Ausdrücken werden die Elemente verglichen.
- Bei neuen Ausdrücken werden der Konstruktor, die Argumente und die Mitglieder verglichen.
- Bei bedingten Ausdrücken werden die Elemente verglichen der Test, wenn falsch, und wenn wahr Ausdrücke.
- Wenn keines der oben genannten Kriterien zutrifft, wirft die Funktion a NotImplementedException.
Vorteile:
- Unterstützt eine breite Palette von Ausdruckstypen.
- Vergleicht ASTs effizienter und eleganter Art und Weise.
- Verfügbar als NuGet-Paket für einfache Integration.
Das obige ist der detaillierte Inhalt vonWie können wir die Gleichheit von Lambda-Ausdrücken in C# effizient vergleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!