【问题标题】:Equality of custom expressions using Expression Trees使用表达式树的自定义表达式的相等性
【发布时间】:2013-08-05 19:46:32
【问题描述】:

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

所以Hello world 匹配,但Goodbye Town 不匹配。

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

我用过搜索,类似这个解决方案Expression Trees in NHibernate 但一点也不。

【问题讨论】:

  • 为什么你认为表达式树非常适合解决这个问题?
  • “我可以像这样构建一棵树” - 请发布您用来构建树的代码

标签: c# .net expression-trees


【解决方案1】:

这是使用复合模式的合适时机。创建一个表达式接口,然后为 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 进行一些更改,以使构建这些树更加简洁。 (即带有参数的可选构造函数重载。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    相关资源
    最近更新 更多