所以这就是问题所在。这与Regex类似:我有一个模式,可以知道表达式匹配。例如,我有一个像这样的图像
因此Hello world
匹配,但Goodbye Town
不匹配。
我该怎么办?我可以像这样构建一个树,但我不知道如何使用它来检查输入匹配。
我使用过搜索,它类似于解决Expression Trees in NHibernate 但根本没有。
答案 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重载。)