1

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

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我留下的表达式。

键入后,这似乎是一个不错的方法。有没有人有我想念的更快的解决方案?

4

2 回答 2

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();
于 2013-07-29T21:14:36.703 回答
1

只要您的括号嵌套总是像您的示例,您提出的解决方案听起来很容易实现。但是,如果它们可以嵌套,那么您正在谈论制作状态机或至少以某种方式实现匹配括号,这是不平凡的。

处理该问题的一种方法是将 all 替换TRUE OR FALSETRUE,然后将 all 替换(TRUE)TRUE,这应该可以处理所有情况,但这需要大量替换。尽管如此,在您的方案中使用字符串作为状态占位符似乎没问题,尽管您可能会考虑通过使用单词TRUEFALSE一些编码(如0and 1and&|for and and or)来获得一些小的性能增益。

于 2013-07-29T21:11:32.493 回答