一尘不染

如何检查两个表达式>相同[重复]

c#

这个问题已经在这里有了答案

测试lambda表达式相等性的最有效方法 (5个答案)

7年前关闭。

是否可以找出两个表达式是否相同?

像下面给出的四个表达式:

        Expression<Func<int, bool>> a = x => false;
        Expression<Func<int, bool>> b = x => false;
        Expression<Func<int, bool>> c = x => true;
        Expression<Func<int, bool>> d = x => x == 5;

然后,至少 我们 可以看到:

  • a == b
  • a != c
  • a != d

但是我可以做些什么来在我的代码中找到答案吗?

窥视了msdn库,其中说

Equals:确定指定的Object是否等于当前的Object Object。(继承自Object。)

我猜这意味着至少Expression类没有重写equals方法成为Equatable吗?那么,您将如何做呢?还是我在这里要求太多?:p


阅读 435

收藏
2020-05-19

共1个答案

一尘不染

您可以看一下Linq to db4o内部使用的类型ExpressionEqualityComparer。它实现了IEqualityComparer
接口,因此可用于通用集合以及独立使用。

它使用ExpressionComparison类型比较两个Expression是否相等,并使用HashCodeCalculation来根据Expression计算哈希码。

所有这些都涉及访问表达式树,因此,如果您反复进行操作,可能会花费很多,但也很方便。

该代码在GPL或dOCL下可用

例如,这是您的测试:

using System;
using System.Linq.Expressions;

using Db4objects.Db4o.Linq.Expressions;

class Test {

    static void Main ()
    {
        Expression<Func<int, bool>> a = x => false;
        Expression<Func<int, bool>> b = x => false;
        Expression<Func<int, bool>> c = x => true;
        Expression<Func<int, bool>> d = x => x == 5;

        Func<Expression, Expression, bool> eq =
            ExpressionEqualityComparer.Instance.Equals;

        Console.WriteLine (eq (a, b));
        Console.WriteLine (eq (a, c));
        Console.WriteLine (eq (a, d));
    }
}

它确实会打印True,False,False。

2020-05-19