【问题标题】:Evaluate Custom Boolean Expression From String从字符串评估自定义布尔表达式
【发布时间】:2013-07-30 05:14:36
【问题描述】:

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

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 表达式。

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

【问题讨论】:

  • 确保你也抓住了括号 - 除非它总是 (AND..AND..AND)OR(AND..AND...)OR...
  • 您是否考虑过在 codeplex 上使用其中一种布尔解析器? stackoverflow.com/q/5029699/2270839
  • 关于解决方案需要注意的几点:1) 确保考虑布尔优先级顺序,但只要您正确处理括号,这可能不会成为问题,2) 它听起来您不会实现短路,这可能是一件好事,3)如果您的兴趣是代码的清晰度,这可能很好;但是,如果您有兴趣提高它的速度(和功能),您可能需要研究 Tokenization。使用非常小的潜在参数集,只需使用令牌 id 数组就可以非常容易。

标签: c# boolean-expression


【解决方案1】:

另一种选择是创建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();

【讨论】:

    【解决方案2】:

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

    处理这种情况的一种方法是将所有TRUE OR FALSE 替换为TRUE,然后将所有(TRUE) 替换为TRUE,这应该可以处理所有情况,但这是很多替换。不过,在您的方案中使用字符串作为状态占位符似乎没问题,尽管您可能会考虑通过使用 TRUEFALSE01 和 @987654329 等编码来获得一些小的性能提升@ and | for and and or.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2015-05-28
      相关资源
      最近更新 更多