Ash*_*Ash 4 c# string eval boolean-expression
C#:我有一个字符串变量,如下所示:
string a = "(true and true) or (true or false)";
Run Code Online (Sandbox Code Playgroud)
这可以是任何东西,它可以变得更复杂,如:
string b = "((true and false) or (true or false) and not (true and false)) and false";
Run Code Online (Sandbox Code Playgroud)
我所知道的是它是正确的.不能发生这种表达不能被"评估".
有什么方法可以以某种方式评估这个吗?我只想知道该字符串的结果(结果).这意味着我需要"true"或"false"而不是此字符串.
我想我可以做一个解析方法来做到这一点,逐步减少字符串,直到我们得到最终值,但我想知道是否有更好的方法.
Joã*_*elo 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());
Run Code Online (Sandbox Code Playgroud)
这样的事可能吗?
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");
}
Run Code Online (Sandbox Code Playgroud)
请注意,该规范允许使用不同的配方,例如:
"false and false or true"
"false and true or true"
Run Code Online (Sandbox Code Playgroud)
这两种表述的是"真",如果和如果是第一evaluted,和"假" 还是第一次评估.因此,要求每个级别的括号都会更好.需要从左到右评估是另一种选择,但这会使代码更复杂一些.
对于那些可能反对这种问题解决方案的人,请记住,一些数学家认为所有的数学都可以简化为这种符号操作.这是说,罗素和怀特海的主要批评之一的数学原理是,它embues太多意义的公式.
| 归档时间: |
|
| 查看次数: |
2385 次 |
| 最近记录: |