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)
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)
{
...
}
...
}
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!
Stellungnahme: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