C#:我有一个字符串变量,如下所示:
string a = "(true and true) or (true or false)";
这可以是任何东西,它可以变得更复杂,例如:
string b = "((true and false) or (true or false) and not (true and false)) and false";
我所知道的是它是正确的。不能发生这种表达不能被“评估”。
有没有办法让我能以某种方式评估这个?我只想知道该字符串的结果(结果)。这意味着我需要“true”或“false”而不是此字符串。
我想我可以制作一个解析方法,一步一步地减少字符串,直到我们得到最终值,但我想知道是否有更好的方法。
答案 0 :(得分:10)
扩展Rob的评论,您可以将运行时编译与C#4.0 dynamic
支持结合使用,并执行以下操作:
var expression = "(true and false) or (true or false)";
var helper = "" +
"using System; " +
"public class Expression {{ public bool Eval() {{ return {0}; }} }}";
var replaced = expression.Replace("and", "&&").Replace("or", "||");
var references = new string[] { "System.dll" };
var parameters = new CompilerParameters(references, "Test.dll");
var compiler = new CSharpCodeProvider();
var results = compiler.CompileAssemblyFromSource(
parameters,
String.Format(helper, replaced));
dynamic exp = Activator.CreateInstance(
results.CompiledAssembly.GetType("Expression"));
Console.WriteLine(exp.Eval());
答案 1 :(得分:7)
这样的事可能吗?
string previous = string.Empty;
while (b != previous)
{
previous = b;
b = b.Replace("true and false", "false");
b = b.Replace("true and true", "true");
b = b.Replace("false and true", "false");
b = b.Replace("false and false", "false");
b = b.Replace("false or false", "false");
b = b.Replace("true or false", "true");
b = b.Replace("true or true", "true");
b = b.Replace("false or true", "true");
b = b.Replace("(false)", "false");
b = b.Replace("(true)", "true");
b = b.Replace("not false", "true");
b = b.Replace("not true", "false");
}
请注意,该规范允许使用不同的配方,例如:
"false and false or true"
"false and true or true"
如果首先评估和,则这两个表达式都是“true”,如果首先评估或,则这两个表达式都为“false”。因此,要求每个级别的括号都会更好。需要从左到右评估是另一种选择,但这会使代码更复杂。
对于那些可能反对这种问题解决方案的人,请记住,一些数学家认为所有的数学都可以简化为这种符号操作。对于罗素和怀特黑德的 Principia Mathematica 的主要批评之一是said,它使公式具有太多意义。
答案 2 :(得分:2)
解析是你最好的选择。如果你必须检查拼写错误,那会让它变得更难。
答案 3 :(得分:-1)
C#没有Eval方法或类似的东西,只允许你运行这样的语句来获得最终结果。除非我遗漏了某些东西,否则你必须解析并减少这种方式。