使用表达式树的自定义表达式的相等性

时间:2013-08-05 19:46:32

标签: c# .net expression-trees

所以这就是问题所在。这与Regex类似:我有一个模式,可以知道表达式匹配。例如,我有一个像这样的图像

enter image description here

因此Hello world匹配,但Goodbye Town不匹配。

我该怎么办?我可以像这样构建一个树,但我不知道如何使用它来检查输入匹配。

我使用过搜索,它类似于解决Expression Trees in NHibernate 但根本没有。

1 个答案:

答案 0 :(得分:4)

这是使用Composite模式的合适时间。创建表达式接口,然后创建And,Or和单个值的类。然后,您可以编写这些类来创建树:

public interface IExpression
{
    bool Match(string value);
}

public class AndExpression : IExpression
{
    private IEnumerable<IExpression> expressions;

    public AndExpression(IEnumerable<IExpression> expressions)
    {
        this.expressions = expressions;
    }
    public bool Match(string value)
    {
        return expressions.All(exp => exp.Match(value));
    }
}
public class OrExpression : IExpression
{
    private IEnumerable<IExpression> expressions;

    public OrExpression(IEnumerable<IExpression> expressions)
    {
        this.expressions = expressions;
    }
    public bool Match(string value)
    {
        return expressions.Any(exp => exp.Match(value));
    }
}
public class ContainsExpression : IExpression
{
    private string search;
    public ContainsExpression(string search)
    {
        this.search = search;
    }

    public bool Match(string value)
    {
        return value.Contains(search);
    }
}

以下是您提供的树的实现:

IExpression root = new AndExpression(new IExpression[]{
    new ContainsExpression("Hello"),
    new OrExpression(new IExpression[]{
        new ContainsExpression("World"),
        new ContainsExpression("Town")})});

请注意,如果您有足够的动力,可以对API进行一些更改,以使构建这些树更加简洁。 (即可选构造函数使用params重载。)