-2

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

例子。

string com = "5 > 10";

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

4

6 回答 6

5

没有内置方法,但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();
于 2012-11-06T18:10:34.783 回答
3

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

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

于 2012-11-06T17:53:39.347 回答
3

不,这不能直接完成。您应该编写自己的类或扩展 String 类。要处理诸如“5 < 10”之类的字符串,您需要自己的方法。

您应该在字符串中搜索指示比较的符号,例如“<”、“==”等,然后将其拆分并执行比较。

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

于 2012-11-06T18:08:38.540 回答
2

不是直接的,本身(没有不安全的 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");
于 2012-11-06T17:54:10.640 回答
2

简短的回答:没有。

长答案:随意解析字符串,寻找 > < 和 =。按空格分割,解析整数然后评估。如果您希望它也可以与括号一起使用,它可能会变得更加困难......

于 2012-11-06T17:50:43.343 回答
1

考虑使用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...

于 2012-11-06T18:25:57.270 回答