【问题标题】:Evaluate string expression and convert to bool?评估字符串表达式并转换为布尔值?
【发布时间】:2020-02-19 15:32:59
【问题描述】:

我想评估字符串表达式并将结果转换为布尔值。

例如

string expression = !((71 > 70) && (80 > 71)) || 72 < 71 ;

上面的表达式必须计算并返回 true。

谁能建议如何评估表达式并返回布尔值?

【问题讨论】:

  • 你必须使用布尔值。布尔表达式 = !((71 > 70) && (80 > 71)) || 72
  • @Jawad 不,那个不一样
  • 好像你一天前也问过同样的问题..here

标签: c# .net c#-3.0


【解决方案1】:

我不相信有任何内置的表达式求解器可以用于这种表达式评估。我会推荐Microsoft.CodeAnalysis.CSharp.Scripting 进行评估。

string expression = "!((71 > 70) && (80 > 71)) || 72 < 71";
bool output = CSharpScript.EvaluateAsync<bool>(expression).Result;
// -> false

您的问题

  • 表达式 不会计算为真。我不知道你为什么假设并要求它这样做。执行上述脚本后,结果 bool 将为 false。

!((71 &gt; 70) &amp;&amp; (80 &gt; 71)) || 72 &lt; 71
!((true) &amp;&amp; (true)) || false
!(true &amp; true)
false

  • 你不能声明一个没有引号的字符串; string express = "within quotes";。上述帖子 (string expression = !((71 &gt; 70) &amp;&amp; (80 &gt; 71)) || 72 &lt; 71 ;) 中的语句不是有效的 C# 语句。

Test snippet here at #dotnetfiddle

【讨论】:

    【解决方案2】:

    您可以使用 NCalc 包。下面的代码产生“假”

    using System;
    using NCalc;
    
    public class Program
    {
        public static void Main()
        {
            Expression e = new Expression("!((71 > 70) && (80 > 71)) || 72 < 71");
            bool v = (bool)e.Evaluate();
            Console.WriteLine(v.ToString());
        }
    }
    

    .Net 小提琴:https://dotnetfiddle.net/02c5ww

    【讨论】:

      【解决方案3】:

      如果您的要求是将 expressoin 输出为字符串“true”,请使用它,

      string expression = Convert.ToString(!((71 > 70) && (80 > 71)) || 72 < 71);
      

      如果要求得到 bool "true" 然后使用它,

      bool expression = !((71 > 70) && (80 > 71)) || 72 < 71;
      

      但是你的表达式就像它会返回假,要使它成为真的删除“!”如下,

      string expression = Convert.ToString(((71 > 70) && (80 > 71)) || 72 < 71);            
      bool bool_expression = ((71 > 70) && (80 > 71)) || 72 < 71;
      

      【讨论】:

      • 上面的表达式是动态表达式。那么如何将字符串转换为bool。我不能直接将表达式分配给 bool 变量。 bool bool_expression = Convert.ToBoolean(string_expression) 不起作用。还有什么建议吗?
      • 对不起...我没有正确阅读并按照示例回答。祝你好运...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      相关资源
      最近更新 更多