首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何检查两个Expression <Func <T,bool >>是否相同

要检查两个Expression <Func <T,bool >>是否相同,可以使用以下方法:

  1. 将两个Expression <Func <T,bool >>转换为字符串表示形式,然后比较字符串是否相同。
  2. 使用ExpressionVisitor类来递归地比较两个Expression <Func <T,bool >>的节点是否相同。
  3. 使用ExpressionEqualityComparer类来比较两个Expression <Func <T,bool >>是否相同。

以下是示例代码:

代码语言:csharp
复制

public static bool AreExpressionsEqual<T>(Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)

{

代码语言:txt
复制
// 方法1:将两个Expression <Func <T,bool >>转换为字符串表示形式,然后比较字符串是否相同。
代码语言:txt
复制
string str1 = expr1.ToString();
代码语言:txt
复制
string str2 = expr2.ToString();
代码语言:txt
复制
if (str1 == str2)
代码语言:txt
复制
{
代码语言:txt
复制
    return true;
代码语言:txt
复制
}
代码语言:txt
复制
// 方法2:使用ExpressionVisitor类来递归地比较两个Expression <Func <T,bool >>的节点是否相同。
代码语言:txt
复制
ExpressionEqualityVisitor visitor = new ExpressionEqualityVisitor();
代码语言:txt
复制
if (visitor.Equals(expr1, expr2))
代码语言:txt
复制
{
代码语言:txt
复制
    return true;
代码语言:txt
复制
}
代码语言:txt
复制
// 方法3:使用ExpressionEqualityComparer类来比较两个Expression <Func <T,bool >>是否相同。
代码语言:txt
复制
ExpressionEqualityComparer comparer = new ExpressionEqualityComparer();
代码语言:txt
复制
if (comparer.Equals(expr1, expr2))
代码语言:txt
复制
{
代码语言:txt
复制
    return true;
代码语言:txt
复制
}
代码语言:txt
复制
return false;

}

public class ExpressionEqualityVisitor : ExpressionVisitor

{

代码语言:txt
复制
private readonly Stack<Expression> _expressions = new Stack<Expression>();
代码语言:txt
复制
public bool Equals(Expression x, Expression y)
代码语言:txt
复制
{
代码语言:txt
复制
    _expressions.Clear();
代码语言:txt
复制
    _expressions.Push(x);
代码语言:txt
复制
    _expressions.Push(y);
代码语言:txt
复制
    return Visit(x, y);
代码语言:txt
复制
}
代码语言:txt
复制
protected override bool Visit(Expression x, Expression y)
代码语言:txt
复制
{
代码语言:txt
复制
    if (x == null && y == null)
代码语言:txt
复制
    {
代码语言:txt
复制
        return true;
代码语言:txt
复制
    }
代码语言:txt
复制
    if (x == null || y == null || x.NodeType != y.NodeType || x.Type != y.Type)
代码语言:txt
复制
    {
代码语言:txt
复制
        return false;
代码语言:txt
复制
    }
代码语言:txt
复制
    switch (x.NodeType)
代码语言:txt
复制
    {
代码语言:txt
复制
        case ExpressionType.Negate:
代码语言:txt
复制
        case ExpressionType.NegateChecked:
代码语言:txt
复制
        case ExpressionType.Not:
代码语言:txt
复制
        case ExpressionType.Convert:
代码语言:txt
复制
        case ExpressionType.ConvertChecked:
代码语言:txt
复制
        case ExpressionType.ArrayLength:
代码语言:txt
复制
        case ExpressionType.Quote:
代码语言:txt
复制
        case ExpressionType.TypeAs:
代码语言:txt
复制
        case ExpressionType.UnaryPlus:
代码语言:txt
复制
            return VisitUnary((UnaryExpression)x, (UnaryExpression)y);
代码语言:txt
复制
        case ExpressionType.Add:
代码语言:txt
复制
        case ExpressionType.AddChecked:
代码语言:txt
复制
        case ExpressionType.Subtract:
代码语言:txt
复制
        case ExpressionType.SubtractChecked:
代码语言:txt
复制
        case ExpressionType.Multiply:
代码语言:txt
复制
        case ExpressionType.MultiplyChecked:
代码语言:txt
复制
        case ExpressionType.Divide:
代码语言:txt
复制
        case ExpressionType.Modulo:
代码语言:txt
复制
        case ExpressionType.And:
代码语言:txt
复制
        case ExpressionType.AndAlso:
代码语言:txt
复制
        case ExpressionType.Or:
代码语言:txt
复制
        case ExpressionType.OrElse:
代码语言:txt
复制
        case ExpressionType.LessThan:
代码语言:txt
复制
        case ExpressionType.LessThanOrEqual:
代码语言:txt
复制
        case ExpressionType.GreaterThan:
代码语言:txt
复制
        case ExpressionType.GreaterThanOrEqual:
代码语言:txt
复制
        case ExpressionType.Equal:
代码语言:txt
复制
        case ExpressionType.NotEqual:
代码语言:txt
复制
        case ExpressionType.Coalesce:
代码语言:txt
复制
        case ExpressionType.ArrayIndex:
代码语言:txt
复制
        case ExpressionType.RightShift:
代码语言:txt
复制
        case ExpressionType.LeftShift:
代码语言:txt
复制
        case ExpressionType.ExclusiveOr:
代码语言:txt
复制
            return VisitBinary((BinaryExpression)x, (BinaryExpression)y);
代码语言:txt
复制
        case ExpressionType.TypeIs:
代码语言:txt
复制
            return VisitTypeIs((TypeBinaryExpression)x, (TypeBinaryExpression)y);
代码语言:txt
复制
        case ExpressionType.Conditional:
代码语言:txt
复制
            return VisitConditional((ConditionalExpression)x, (ConditionalExpression)y);
代码语言:txt
复制
        case ExpressionType.Constant:
代码语言:txt
复制
            return VisitConstant((ConstantExpression)x, (ConstantExpression)y);
代码语言:txt
复制
        case ExpressionType.Parameter:
代码语言:txt
复制
            return VisitParameter((ParameterExpression)x, (ParameterExpression)y);
代码语言:txt
复制
        case ExpressionType.MemberAccess:
代码语言:txt
复制
            return VisitMemberAccess((MemberExpression)x, (MemberExpression)y);
代码语言:txt
复制
        case ExpressionType.Call:
代码语言:txt
复制
            return VisitMethodCall((MethodCallExpression)x, (MethodCallExpression)y);
代码语言:txt
复制
        case ExpressionType.Lambda:
代码语言:txt
复制
            return VisitLambda((LambdaExpression)x, (LambdaExpression)y);
代码语言:txt
复制
        case ExpressionType.New:
代码语言:txt
复制
            return VisitNew((NewExpression)x, (NewExpression)y);
代码语言:txt
复制
        case ExpressionType.MemberInit:
代码语言:txt
复制
            return VisitMemberInit((MemberInitExpression)x, (MemberInitExpression)y);
代码语言:txt
复制
        case ExpressionType.ListInit:
代码语言:txt
复制
            return VisitListInit((ListInitExpression)x, (ListInitExpression)y);
代码语言:txt
复制
        case ExpressionType.NewArrayInit:
代码语言:txt
复制
        case ExpressionType.NewArrayBounds:
代码语言:txt
复制
            return VisitNewArray((NewArrayExpression)x, (NewArrayExpression)y);
代码语言:txt
复制
        case ExpressionType.Invoke:
代码语言:txt
复制
            return VisitInvocation((InvocationExpression)x, (InvocationExpression)y);
代码语言:txt
复制
        case ExpressionType.Index:
代码语言:txt
复制
            return VisitIndex((IndexExpression)x, (IndexExpression)y);
代码语言:txt
复制
        case ExpressionType.Extension:
代码语言:txt
复制
            return VisitExtension(x, y);
代码语言:txt
复制
        default:
代码语言:txt
复制
            throw new NotSupportedException(string.Format("Unhandled expression type: '{0}'", x.NodeType));
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
protected override Expression VisitBinary(BinaryExpression x, BinaryExpression y)
代码语言:txt
复制
{
代码语言:txt
复制
    if (!Equals(x.Method, y.Method))
代码语言:txt
复制
    {
代码语言:txt
复制
        return false;
代码语言:txt
复制
    }
代码语言:txt
复制
    if (!Visit(x.Left, y.Left))
代码语言:txt
复制
    {
代码语言:txt
复制
        return false;
代码语言:txt
复制
    }
代码语言:txt
复制
    if (!Visit(x.Right, y.Right))
代码语言:txt
复制
    {
代码语言:txt
复制
        return false;
代码语言:txt
复制
    }
代码语言:txt
复制
    return true;
代码语言:txt
复制
}
代码语言:txt
复制
protected override Expression VisitConditional(ConditionalExpression x, ConditionalExpression y)
代码语言:txt
复制
{
代码语言:txt
复制
    if (!Visit(x.Test, y.Test))
代码语言:txt
复制
    {
代码语言:txt
复制
        return false;
代码语言:txt
复制
    }
代码语言:txt
复制
    if (!Visit(x.IfTrue, y.IfTrue))
代码语言:txt
复制
    {
代码语言:txt
复制
        return false
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何使用 Python 检查两个列表是否反向相等?

在 Python 中使用列表时,在某些情况下,您可能需要比较两个列表是否反向相等。这意味着一个列表中的元素与另一个列表中的元素相同,但顺序相反。...在 Python 中,我们可以使用反转和比较列表、使用 zip() 函数、将列表转换为字符串等方法检查两个列表是否反向相等。在本文中,我们将了解这些方法,并借助各种示例检查两个列表是否反向相等。...该函数反转 list1 并检查是否等于 list2。由于反转列表等于 list2,因此输出为 True。...all() 函数用于检查是否所有元素对相等。 例 在下面的示例中,list1 和 list2 与上一个示例中相同。调用函数 are_lists_reverse_equal,将这些列表作为参数。...Python 中使用不同的方式检查两个列表是否反向相等。

18720
  • 表达式树练习实践:C# 五类运算符的表达式树表达

    ; Expression> lambda = Expression.Lambda>(ab, a,...=、>、=、<= C# 中的关系运算符如下 运算符 描述 == 检查两个操作数的值是否相等,如果相等则条件为真。 != 检查两个操作数的值是否相等,如果不相等则条件为真。...> 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 < 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 >= 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。...<= 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 == 表示相等比较,如果是值类型和 string 类型,则比较值是否相同;如果是引用类型,则比较引用的地址是否相等。...则为 X : 否则为 Y is 判断对象是否为某一类型。 If( Ford is Car) // 检查 Ford 是否是 Car 类的一个对象。 as 强制转换,即使转换失败也不会抛出异常。

    77730

    Go每日一库之175:goexpr (通用表达式引擎)

    检查字符串中的任意一个是否包含在s中 contains_any("hello world", "world", "golang") match true count(s, sub) 检查字符串中包含子串的次数...conutry match "cn" greater 检查左操作数是否大于右操作数 wind greater 10 less 检查做操作数是否小于右操作数 weather less 30 in 检查左操作数是否处于右操作数列表中...首先我们需要实现一个操作数(Operand),如何实现可以参考4.1.1章节。然后进行注册。..., t operand.Operand) operand.Operand 比如想要实现contains: func Contains(s operand.Operand, substrs ...operand.Operand...一个操作符必须符合如下约束: type Operator = func(l operand.Operand, rs ...operand.Operand) bool l为左操作数,rs为右操作数列表。

    2.4K21
    领券