从String评估自定义布尔表达式

时间:2013-07-29 21:04:44

标签: c# boolean-expression

我有一串来自客户端的参数。一个例子可能是:

string param =“(NAME.FULLNAME AND DOB.OPTIONAL)OR(ID AND DOB.REQUIRED)OR(ID and COUNTRY)”

现在,我已经解析了所有传入的数据,并且有布尔值代表每个参数。

喜欢:

bool name_FullName = true;
bool dob_Optional = false;

我正在尝试找到将客户参数表达式评估为True或False的最佳方法。

我在考虑用真/假布尔替换参数。然后找到任意TRUE AND TRUE并删除它们,并将TRUE AND FALSE替换为false。然后评估我留下的OR表达式。

输入后,这似乎是一个很好的方法。有没有人有我错过的更快的解决方案?

2 个答案:

答案 0 :(得分:5)

另一个选择是创建DataTable并使用Select方法。

// create data table
var data = new DataTable();
data.Columns.Add("NAME.FULLNAME", typeof(bool));
data.Columns.Add("DOB.OPTIONAL", typeof(bool));
data.Columns.Add("ID", typeof(bool));
data.Columns.Add("DOB.REQUIRED", typeof(bool));
data.Columns.Add("COUNTRY", typeof(bool));

// fill data table
data.Rows.Add(true, false, true, true, false);

// see if it's a match
var isMatch = data.Select("(NAME.FULLNAME AND DOB.OPTIONAL) OR (ID AND DOB.REQUIRED) OR (ID AND COUNTRY)").Any();

答案 1 :(得分:1)

只要你的括号嵌套总是像你的例子一样,你提出的解决方案听起来很容易实现。但是,如果它们可以嵌套,那么你就是在谈论制作一个状态机,或者至少以某种方式实现匹配括号,这是非常重要的。

处理这种情况的一种方法是将所有TRUE OR FALSE替换为TRUE,然后将所有(TRUE)替换为TRUE,这应该处理所有情况,但这很多替换。尽管如此,在您的方案中使用字符串作为状态占位符似乎还不错,但您可以考虑使用TRUEFALSE这些单词而不是使用01之类的编码来获得一些小的性能提升。 &|以及{{1}} for和or。