Maison >développement back-end >C++ >Comment puis-je comparer efficacement les expressions Lambda pour l'égalité ?

Comment puis-je comparer efficacement les expressions Lambda pour l'égalité ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-03 19:56:38597parcourir

How Can I Efficiently Compare Lambda Expressions for Equality?

Moyen le plus efficace de tester l'égalité des expressions Lambda

Problème

Considérez la signature de la méthode :

public bool AreTheSame<T>(Expression<Func<T, object>> exp1, Expression<Func<T, object>> exp2)

Comment peut-on Déterminez-vous efficacement si deux expressions lambda sont égales ? Cette méthode ne doit gérer que des expressions simples, en particulier les MemberExpressions sous la forme c => c.ID.

Réponse

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

Cette méthode compare les expressions en les décomposant en leurs parties constitutives et en comparant chaque partie individuellement. Il n'effectue pas de comparaison AST complète, mais réduit toutes les expressions constantes et compare directement leurs valeurs.

Détails d'implémentation

L'implémentation de la méthode ExpressionsEqual compare de manière récursive les différentes parties des expressions. Par exemple, si les expressions sont des MemberExpressions, il compare la propriété Member de chaque expression. S'il s'agit de BinaryExpressions, elle compare les propriétés Method, Left et Right.

La méthode gère des cas particuliers tels que ConditionalExpressions et NewArrayExpressions. Il gère également les cas où les expressions ont des types différents, y compris des types anonymes.

Performances

Les performances de cette méthode sont nettement meilleures qu'une comparaison AST complète, en particulier pour les expressions qui contiennent des valeurs constantes. Cela le rend adapté aux cas d'utilisation tels que la validation simulée, où l'expression lambda peut faire référence à des variables locales qui doivent être comparées par valeur.

Package NuGet

Le code est disponible sous forme de package NuGet, qui peut être installé à l'aide de la commande suivante :

Install-Package LambdaCompare

Usage

L'utilisation de la méthode Eq est simple :

var f1 = GetBasicExpr1();
var f2 = GetBasicExpr2();
Assert.IsTrue(LambdaCompare.Eq(f1, f2));

Conclusion

Cette méthode efficace de comparaison des expressions lambda fournit un moyen pratique et performant de déterminer leur égalité. Il est particulièrement utile dans les scénarios où les valeurs de variables locales doivent être comparées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn