是否有可能找出两个表达式是否相同?
喜欢以下四个表达式:
Expression> a = x => false; Expression > b = x => false; Expression > c = x => true; Expression > d = x => x == 5;
那么,至少我们可以看到:
a == b
a != c
a != d
但我可以在我的代码中做任何事情来解决这个问题吗?
在msdn库中查看了它
Equals
:确定指定的Object是否等于当前Object
.(继承自Object
.)
我想这意味着至少Expression类没有覆盖equals方法成为Equatable?那你怎么做?或者我在这里要求太多了?:p
您可以查看Linq到db4o中使用的ExpressionEqualityComparer类型.它实现了IEqualityComparer
它使用ExpressionComparison类型来比较两个表达式的相等性和HashCodeCalculation,以计算Expression中的哈希码.
这一切都涉及到访问表达式树,所以如果你反复这样做可能会非常昂贵,但它也可以非常方便.
该代码可在GPL或dOCL下获得
例如,这是你的测试:
using System; using System.Linq.Expressions; using Db4objects.Db4o.Linq.Expressions; class Test { static void Main () { Expression> a = x => false; Expression > b = x => false; Expression > c = x => true; Expression > d = x => x == 5; Func eq = ExpressionEqualityComparer.Instance.Equals; Console.WriteLine (eq (a, b)); Console.WriteLine (eq (a, c)); Console.WriteLine (eq (a, d)); } }
它确实打印出真,假,假.
作为一个懒惰的答案,你可以检查ToString()
- 它至少应该指出它们明显不同的地方(虽然它会包含var-name,因此必须相同).
准确地检查等价...更难 - 很多工作,在很多不同的节点类型上.