【问题标题】:String evaluation in IF conditionIF 条件下的字符串求值
【发布时间】:2015-12-18 22:57:35
【问题描述】:

假设我有

int a = 1;
int b = 2;
string exp = "b > a";

我想用这些变量评估字符串表达式

if(exp.SomeKindOfParseOrCast())
{
   //here be magic
}

有没有简单的方法?

【问题讨论】:

  • 我认为 Ncalc 可以做到这一点。不完全像这样,但它可以评估表达式。从 nugget 获取库。
  • 尝试DynamicExpression.ParseLambda 之类的东西,比如How to convert a String to its equivalent Expression Tree?(使用第三方库)。或者你甚至不需要从字符串开始,而是可以直接从表达式树开始?

标签: c# parsing if-statement conditional-statements evaluation


【解决方案1】:

不,不是在 C# 中 - 这些是参数名称,因此是 编译时间 值,您描述的这个表达式解析是在 runtime 中完成的 - 计算机没有'在评估时不知道参数的名称。相反,您可以做一些更严格的事情,例如 表达式解析器 - 实现您自己的 方式来解析字符串表达式。

非常非常简单:

if(exp.Equals("b > a"))
{
 if(b>a)
  // do what you do if b is bigger than a
 else 
  // do what you do with a wrong expression
}
else if (exp.Equals("a > b")
{ 
 if(a>b)
  // do what you do if a is bigger than b
 else
  // do what you do with a wrong expression
}
else if (exp.Equals("a = b")
{
 if(a==b)
  // do what you do if a is equal to b
 else 
  // do what you do with a wrong expression
}
else
 // do what you do with a badly formatted expression

如果你想更进一步,你可以删减空格,确保表达式是小写的,等等 - 周围有很多例子,我个人喜欢this one.

【讨论】:

  • 感谢您的参与。不幸的是,我需要动态生成它,因为字符串可能很长并且完全随机,可以说“(a > 5 or b >=3)|| c 7 || (b > 3 && c = 0)"。在这种情况下,您有什么建议?
  • @user3672414 好吧,如果这就是你要告诉我的全部内容,我建议构建一个巨大的解析器,因为我看不到其他任何东西。如果你能告诉我你到底想做什么,我们可能会找到解决办法。
  • @OndrejTucny 当然,你取一个表达式,对它运行一堆操作来修剪它并使其适合特定格式,然后你分析它......但我不打算这样做只是为了说明这一点。我相信我提供的链接已经足够好了。
【解决方案2】:

有没有简单的方法?

不,在 C# 中,这不可能像在 JavaScript 等具有 eval 函数的语言中那样简单。无论如何,您必须提供表达式内参数与实际值的绑定。

【讨论】:

  • 罗斯林号怎么样?我不知道Roslyn,但我看到它可以在运行时编译和使用代码。
  • @Karol 我认为 Roslyn 在这里太过分了。通过编译和执行,你突然面临一堆安全问题。 NCalc 或其他一些表达式解释器是更安全的选择。
  • 你是对的,但这是一种可能的解决方案。将来作者和口译员的需求可能会增加,表达不够。与否;-) 最佳解决方案取决于作者的具体需求。
  • @Karol 而 that 是这个问题的问题 - 没有具体要求。
【解决方案3】:

您可以使用罗斯林。 这是一个example,介绍了如何在运行时编译和运行自己的代码。

【讨论】:

    【解决方案4】:

    免责声明:我是项目的所有者Eval Expression.NET

    这个库非常易于使用,可以评估和编译几乎所有的 C# 语言。

    // For single evaluation
    var value1 = Eval.Execute<bool>("b > a", new { a = 1, b = 2 });
    
    // For many evaluation
    var compiled = Eval.Compile<Func<int, int, bool>>("b > a", "a", "b");
    var value2 = compiled(1, 2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多