考虑方法签名:
public bool AreTheSame<T>(Expression<Func<T, object>> exp1, Expression<Func<T, object>> exp2)
如何您可以有效地确定两个 lambda 表达式是否相等吗?此方法应该只处理简单的表达式,特别是形式为 c => 的 MemberExpressions c.ID.
public static bool Eq<TSource, TValue>( Expression<Func<TSource, TValue>> x, Expression<Func<TSource, TValue>> y) { return ExpressionsEqual(x, y, null, null); }
此方法通过将表达式分解为各个组成部分并单独比较每个部分来比较表达式。它不执行完整的 AST 比较,而是折叠任何常量表达式并直接比较它们的值。
ExpressionsEqual 方法的实现递归地比较表达式的不同部分。例如,如果表达式是 MemberExpressions,它会比较每个表达式的 Member 属性。如果它们是 BinaryExpressions,它会比较 Method、Left 和 Right 属性。
该方法处理特殊情况,例如 ConditionalExpressions 和 NewArrayExpressions。它还处理表达式具有不同类型(包括匿名类型)的情况。
此方法的性能明显优于完整 AST 比较,特别是对于包含常量值的表达式。这使得它适合模拟验证等用例,其中 lambda 表达式可能引用应按值进行比较的局部变量。
代码可作为 NuGet 包使用,它可以使用以下命令安装:
Install-Package LambdaCompare
Eq方法的用法是简单明了:
var f1 = GetBasicExpr1(); var f2 = GetBasicExpr2(); Assert.IsTrue(LambdaCompare.Eq(f1, f2));
这种比较 lambda 表达式的有效方法提供了一种方便且高效的方法来确定它们的相等性。在需要比较局部变量值的场景中特别有用。
以上是如何有效比较 Lambda 表达式是否相等?的详细内容。更多信息请关注PHP中文网其他相关文章!