2017-06-14 22 views
0

評估算術表達式我需要從字符串冪評估算術表達式,例如:與冪從字符串

string expression = "4*5+2^3" 

^符號可以改變任何其他符號或字符串,但它在被寫入與+ - *操作方式相同,因爲數字和運算符有些隨機生成。 有沒有辦法做到這一點?我不知道,你可以寫冪操作這種方式NCalc或Jace.Net

+0

我沒有看到任何簡單的解決方案。你必須對錶達式進行標記,然後用'Math.Pow' ...複數代替'^'。 – xanatos

+0

由於5+(3 + 2)^(4 + 3)是「複雜的」(括號),因此將表達式標記化非常複雜,並且它可以變得更加容易。 – xanatos

回答

0

你可以寫如下計算器類來執行動態的C#代碼:

public class Evaluator 
{ 
    public int Evaluate(string expression) 
    { 
     CSharpCodeProvider codeProvider = new CSharpCodeProvider(); 
     CompilerParameters compilerParameters = new CompilerParameters(); 
     compilerParameters.ReferencedAssemblies.Add("system.dll"); 
     compilerParameters.CompilerOptions = "/t:library"; 
     compilerParameters.GenerateInMemory = true; 

     StringBuilder typeDefinition = new StringBuilder(""); 
     typeDefinition.AppendLine("using System;"); 
     typeDefinition.AppendLine("namespace Evaluator"); 
     typeDefinition.AppendLine("{"); 
     typeDefinition.AppendLine(" public class Evaluator"); 
     typeDefinition.AppendLine(" {"); 
     typeDefinition.AppendLine("  public object Evaluate()"); 
     typeDefinition.AppendLine("  {"); 
     typeDefinition.AppendLine("   return " + expression + ";"); 
     typeDefinition.AppendLine("  }"); 
     typeDefinition.AppendLine(" }"); 
     typeDefinition.AppendLine("}"); 

     CompilerResults compilerResult = codeProvider.CompileAssemblyFromSource(compilerParameters, typeDefinition.ToString()); 

     System.Reflection.Assembly a = compilerResult.CompiledAssembly; 
     object o = a.CreateInstance("Evaluator.Evaluator"); 
     Type dynamicEvaluatorType = o.GetType(); 
     MethodInfo dynamicEvaluateMethod = dynamicEvaluatorType.GetMethod("Evaluate"); 
     return (int) dynamicEvaluateMethod.Invoke(o, null); 
    } 
} 

然後你可以使用它這樣:

 string expression = "4*5+2"; 
     int result = new Evaluator().Evaluate(expression); 
+0

C#中的'^'不是冪,它是xor。指數運算是'Math.Pow(...)' – xanatos