2013-08-05 67 views
0

所以這是問題。這與Regex類似:我有一個模式,可以知道表達式匹配。例如,我有這樣的使用表達式樹的自定義表達式的相等性

enter image description here

所以Hello world的圖像匹配,但Goodbye Town沒有。

我該怎麼辦?我可以像這樣構建一棵樹,但我不知道如何使用它來檢查輸入匹配。

我已經使用了搜索,它與此類似,求解Expression Trees in NHibernate 但根本沒有。

+2

爲什麼你認爲表達式樹是很適合解決這個問題呢? –

+0

*「我可以像這樣構建樹」* - 請發佈您用來構建樹的代碼 – GolfWolf

回答

4

這是一個適當的時間使用複合圖案。創建一個表達式接口,然後爲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,使構建這些樹如果你有適當的動機,那麼更簡潔一點。 (即可選構造函數重載使用參數。)