Comparer efficacement l'égalité des expressions Lambda
Défi :
Étant donné une signature de méthode :
public bool AreTheSame<T>(Expression<Func<T, object>> exp1, Expression<Func<T, object>> exp2)
Copier après la connexion
Déterminez la méthode la plus efficace pour vérifier si les deux expressions sont équivalentes. Cette évaluation ne doit prendre en charge que les expressions membres simples, comme c => c.ID.
Solution proposée :
Une version optimisée du code de Marc qui prend en charge les tableaux, les nouveaux opérateurs et bien plus encore est présentée ci-dessous. Il utilise une méthode plus élégante pour comparer les AST.
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)
{
...
}
...
}
Copier après la connexion
Explication détaillée :
- Ce code vérifie si les deux expressions sont identiques par référence avant en les comparant valeur par valeur.
- Il évalue si ce sont toutes deux des expressions constantes et, si tel est le cas, détermine leur valeurs.
- Si les expressions ne sont pas du même type, la fonction renvoie false.
- Pour les expressions lambda, elle compare les paramètres et le corps des expressions.
- Pour les membres expressions, il compare le membre et l'expression sous-jacente.
- Pour les expressions binaires, il compare la méthode, l'expression de gauche et l'expression de droite expression.
- Pour les expressions unaires, il compare la méthode et l'opérande.
- Pour les expressions de paramètres, il compare leurs indices dans les listes de paramètres.
- Pour les expressions d'appel de méthode, il compare la méthode, l'objet et les arguments.
- Pour les expressions d'initialisation de membre, il compare la nouvelle expression et le membre liaisons.
- Pour les nouvelles expressions de tableau, il compare les éléments.
- Pour les nouvelles expressions, il compare le constructeur, les arguments et les membres.
- Pour les expressions conditionnelles, il compare le test, si les expressions sont fausses et si vraies.
- Si aucun des critères ci-dessus ne correspond, la fonction lance un NotImplementedException.
Avantages :
- Prend en charge un large éventail de types d'expression.
- Compare les AST de manière plus efficace et plus élégante. manière.
- Disponible sous forme de package NuGet pour faciliter intégration.
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!