首页 > 后端开发 > C++ > 如何有效比较 Lambda 表达式是否相等?

如何有效比较 Lambda 表达式是否相等?

Barbara Streisand
发布: 2025-01-03 19:56:38
原创
585 人浏览过

How Can I Efficiently Compare Lambda Expressions for Equality?

测试 Lambda 表达式相等性的最有效方法

问题

考虑方法签名:

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 包

代码可作为 NuGet 包使用,它可以使用以下命令安装:

Install-Package LambdaCompare
登录后复制

用法

Eq方法的用法是简单明了:

var f1 = GetBasicExpr1();
var f2 = GetBasicExpr2();
Assert.IsTrue(LambdaCompare.Eq(f1, f2));
登录后复制

结论

这种比较 lambda 表达式的有效方法提供了一种方便且高效的方法来确定它们的相等性。在需要比较局部变量值的场景中特别有用。

以上是如何有效比较 Lambda 表达式是否相等?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板