有没有办法在字符串值中进行比较可以返回Boolean
值。例。
如果(5> 5000)显然会返回假值。但我想做的是让“5> 5000”返回假值。
实施例
string com = "5 > 10";
有没有办法让这个com
变量返回一个false
值,就像它是整数之间的比较一样。
答案 0 :(得分: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();
答案 1 :(得分:3)
没有内置方法可以做到这一点。
虽然有几种方法可以解决这个问题,但其中一种方法就是自己解析文本。我在文章A C# Expression Evaluator中提供的代码中执行了此操作。您可能想要查看该代码。
答案 2 :(得分:3)
不,这不能直接完成。 您应该编写自己的类或扩展String类。对于处理诸如“5&lt; 10”的字符串,您需要自己的方法。
您应该在字符串中搜索指示比较的符号,例如“&lt;”,“==”等,然后将其拆分并执行比较。
基本上:自己动手是唯一的方法,但你可以尝试以优雅的方式去做。
答案 3 :(得分:2)
简答:不。
答案很长:随意自己解析字符串,寻找&gt; &LT;和=。按空格分割,解析整数然后进行评估。如果你想让它与括号一起工作可能会变得更难......
答案 4 :(得分: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");
答案 5 :(得分:1)
考虑使用FLEE:
Flee是.NET框架的表达式解析器和评估器。它允许您在运行时计算字符串表达式的值,例如sqrt(a ^ 2 + b ^ 2)。它使用自定义编译器,强类型表达式语言和轻量级codegen将表达式直接编译为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