我有一串来自客户端的参数。一个例子可能是:
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
表达式。
输入后,这似乎是一个很好的方法。有没有人有我错过的更快的解决方案?
答案 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
,这应该处理所有情况,但这很多替换。尽管如此,在您的方案中使用字符串作为状态占位符似乎还不错,但您可以考虑使用TRUE
和FALSE
这些单词而不是使用0
和1
之类的编码来获得一些小的性能提升。 &
和|
以及{{1}} for和or。