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

C# 使用表达式树的自定义表达式的相等性,c#,.net,expression-trees,C#,.net,Expression Trees,这就是问题所在。这类似于正则表达式:我有一个模式,可以知道表达式是否匹配。例如,我有一个这样的图像 所以,Hello world是匹配的,但是,bye Town不是 我怎么做?我可以构建这样的树,但我不知道如何使用它来检查输入是否匹配 我使用了搜索,它类似于这个解决方案 但一点也不。这是使用复合模式的适当时机。创建表达式接口,然后为and、Or和单个值创建类。然后,您可以组合这些类来创建树: public interface IExpression { bool Match(strin

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

所以,
Hello world
是匹配的,但是,
bye Town
不是

我怎么做?我可以构建这样的树,但我不知道如何使用它来检查输入是否匹配

我使用了搜索,它类似于这个解决方案
但一点也不。这是使用复合模式的适当时机。创建表达式接口,然后为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);
    }
}

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

这是使用复合模式的适当时机。创建表达式接口,然后为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);
    }
}

请注意,如果您有适当的动机,可以对API进行一些更改,使构建这些树更加简洁。(即,可选构造函数重载和参数。)

为什么您认为表达式树非常适合解决此问题?“我可以构建这样的树”-请发布用于构建树的代码为什么您认为表达式树非常适合解决此问题?“我可以构建这样的树”-请发布用于构建树的代码