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

标签 c# expression equality

<分区>

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

如给出以下四个表达式:

        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: Determines whether the specified Object is equal to the current Object. (Inherited from Object.)

我猜这意味着至少 Expression 类没有重写 equals 方法成为 Equatable?那你会怎么做呢?还是我在这里要求太多? :p

最佳答案

你可以看看类型 ExpressionEqualityComparerLinq to db4o 中使用.它实现了 IEqualityComparer 接口(interface),因此可用于通用集合以及独立使用。

它使用类型 ExpressionComparison比较两个表达式是否相等,以及 HashCodeCalculation , 从表达式计算哈希码。

这一切都涉及到访问表达式树,因此如果您重复执行它可能会非常昂贵,但它也非常方便。

代码在 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。

关于c# - 如何检查两个 Expression<Func<T, bool>> 是否相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/673205/

相关文章:

c# - 如何将可选指针参数从 C++ 代码转换为 C#

php - 为什么 $a += 3 比 $a = $a + 3 执行得更快?

javascript - 正则表达式和检查表单

compiler-errors - Java中的范围检查编译困难

javascript - Javascript 中 null 和 undefined 与 bool 值的比较

algorithm - 范围内所有元素的相等性

YUI 日历的 c# 到 javascript

c# - 如何在 ASP.NET Web 应用程序中从 Exchange 2010 服务器下载邮件?

c# - WPF:XAML 解析异常未处理

function - Clojure - 测试函数表达式的相等性?