所以这是问题。这类似于正则表达式:我有一个模式并且可以知道表达式是否匹配。例如我有这样的图像
Hello world
匹配也是如此,但Goodbye Town
不是。
我该怎么做?我可以像这样构建一棵树,但我不知道如何使用它来检查输入是否匹配。
我使用了一个搜索,它类似于这个解决NHibernate 中的表达式树, 但根本不是。
所以这是问题。这类似于正则表达式:我有一个模式并且可以知道表达式是否匹配。例如我有这样的图像
Hello world
匹配也是如此,但Goodbye Town
不是。
我该怎么做?我可以像这样构建一棵树,但我不知道如何使用它来检查输入是否匹配。
我使用了一个搜索,它类似于这个解决NHibernate 中的表达式树, 但根本不是。
这是使用复合模式的合适时机。创建一个表达式接口,然后为 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 进行一些更改,以使构建这些树更加简洁。(即带有参数的可选构造函数重载。)