当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何检查两个Expression<Func<T,bool>>是否相同》经验,为你挑选了2个好方法。

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

喜欢以下四个表达式:

        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



1> Jb Evain..:

您可以查看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));
    }
}

它确实打印出真,假,假.


@JohnNolan,你这样做.对于.net 3.5,ExpressionVisitor不会公开,因此您必须自己动手.对于.net 4.0,此代码需要更新为新类型的表达式.因为它不是内置的,所以它的工作量相当不足为奇.

2> Marc Gravell..:

作为一个懒惰的答案,你可以检查ToString()- 它至少应该指出它们明显不同的地方(虽然它会包含var-name,因此必须相同).

准确地检查等价...更难 - 很多工作,在很多不同的节点类型上.


确切地说 - 我说它会找到明显错误的答案,但那是关于它的.您需要正确地走树,检查所使用的实际操作员等,以便彻底完成工作.
不,并非每个表达式都有可用的字符串表示.例如,转换并不表示它转换为哪种类型.
推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有