【问题标题】:C# Can a comparison in a String value return a Boolean value. eg. "5 < 10" return trueC# 字符串值中的比较能否返回布尔值。例如。 "5 < 10" 返回真
【发布时间】:2012-10-26 17:28:42
【问题描述】:

有没有办法在字符串值中进行比较可以返回Boolean 值。例子。 If (5 > 5000) 显然会返回一个错误值。但我想做的是让“5 > 5000”返回一个错误值。

示例。

string com = "5 > 10";

所以有没有办法让这个com 变量返回一个false 值,就好像它是整数之间的比较一样。

【问题讨论】:

  • 在实现之前你应该确定你想要做这样的事情。如果它基于用户提供的数据,将字符串作为代码运行可能是一个主要安全漏洞。 (如果不是,您可能一开始就不需要这样做。)
  • 你也可以试试NCalc:ncalc.codeplex.com

标签: c# string comparison boolean


【解决方案1】:

没有内置方法,但NCalc 可以在这里提供帮助

NCalc.Expression expr = new NCalc.Expression("5>10");
bool b = (bool)expr.Evaluate();

你甚至可以使用参数

NCalc.Expression expr = new NCalc.Expression("a<b");

expr.EvaluateParameter += (name, args) =>
  {
      if (name == "a") args.Result = 5;
      if (name == "b") args.Result = 10;
  };
bool b = (bool)expr.Evaluate();

【讨论】:

【解决方案2】:

没有内置的方法可以做到这一点。

虽然有几种方法可以解决这个问题,但一种是自己简单地解析文本。我在文章A C# Expression Evaluator 中提供的代码中做到了这一点。您可能想查看该代码。

【讨论】:

  • 除了您发布的文章之外,还有诸如 FLEE (flee.codeplex.com) 和 NCalc (ncalc.codeplex.com) 之类的库,它们的功能几乎相同,但具有附加功能。 Enq 的使用可能有点过头了,但对于阅读此问题/答案的任何人来说都值得考虑。
【解决方案3】:

不,这不能直接完成。 您应该编写自己的类或扩展 String 类。要处理诸如“5

您应该在字符串中搜索指示比较的符号,例如“

基本上:自己做是唯一的方法,但你可以尝试以一种优雅的方式来做。

【讨论】:

    【解决方案4】:

    简短回答:不。

    长答案:随意解析字符串,寻找 >

    【讨论】:

      【解决方案5】:

      本身不是直接的(不安全的 Javascript eval-execute-my-data hack),但您可以尝试自己解析它,具体取决于您想要接受的表达式的复杂程度。例如,这应该适用于您拥有的字符串:

      var arr = com.Split('>').Select(x=>int.Parse(x.Trim())).ToArray();
      return arr[0] > arr[1];
      

      您还可以使用正则表达式来变得更复杂(未经测试,但应该可以):

      var r = new Regex(@"(\d+)\b*(<|>|=|<=|>=)\b*(\d+)")
      var match = r.Match(com);
      if(match.Success)
      {
          var a = int.Parse(match.Captures[0]);
          var b = int.Parse(match.Captures[2]);
      
          switch(match.Captures[1])
          {
               case "<":
                   return a < b;
               case "=":
                   return a = b;
               case ">":
                   return a > b;
               case "<=":
                   return a <= b;
               case "<=":
                   return a >= b;
          }
      }
      
      //uh-oh
      throw new ArgumentException("com");
      

      【讨论】:

        【解决方案6】:

        考虑使用FLEE

        Flee 是 .NET 框架的表达式解析器和求值器。它允许您在运行时计算字符串表达式的值,例如 sqrt(a^2 + b^2)。它使用自定义编译器、强类型表达式语言和轻量级代码生成器将表达式直接编译为 IL。这意味着表达式评估非常快速和高效。试试这个演示,它可以让您根据表情生成图像,并亲眼看看。

        使用FLEE,您可以使用以下方式轻松完成此操作:

                var con = new ExpressionContext();
                const string com = @"5 > 5000";
                var comparison = con.CompileDynamic(com);
                var result = comparison.Evaluate();
                MessageBox.Show(result.ToString());
        

        HTH...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-30
          • 2021-10-22
          • 2018-05-03
          • 2023-03-20
          相关资源
          最近更新 更多