首页 >后端开发 >C++ >如何高效比较 C# 中 Lambda 表达式的相等性?

如何高效比较 C# 中 Lambda 表达式的相等性?

Patricia Arquette
Patricia Arquette原创
2025-01-05 19:57:41911浏览

How Can We Efficiently Compare the Equality of Lambda Expressions in C#?

高效比较 Lambda 表达式的相等性

挑战:
给定方法签名:

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

确定确定两个表达式是否等价的最有效方法。此评估应仅支持简单的 MemberExpressions,例如 c => c.ID.

建议的解决方案:
下面介绍了支持数组、新运算符等的 Marc 代码的优化版本。它采用了一种更优雅的方法来比较 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)
    {
        ...
    }

    ...
}

详细说明:

  • 此代码通过引用检查之前的两个表达式是否相同逐个比较它们。
  • 它评估它们是否都是常量表达式,如果是,则确定它们值。
  • 如果表达式类型不同,函数返回 false。
  • 对于 lambda 表达式,它比较表达式的参数和主体。
  • 对于成员表达式,它比较成员和底层表达式。
  • 对于二进制表达式,它比较方法、左表达式和右表达式表达式。
  • 对于一元表达式,它比较方法和操作数。
  • 对于参数表达式,它比较它们在参数列表中的索引。
  • 对于方法调用表达式,它比较方法、对象和参数。
  • 对于成员 init 表达式,它比较 new 表达式和成员绑定。
  • 对于新数组表达式,它比较元素。
  • 对于新表达式,它比较构造函数、参数和成员。
  • 对于条件表达式,它比较测试、if false 和 if true 表达式。
  • 如果以上条件均不匹配,则该函数会抛出NotImplementedException。

优点:

  • 支持多种表达式类型。
  • 以更高效、更优雅的方式比较 AST
  • 以 NuGet 包形式提供轻松集成。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn