2017-06-14 3 views
0

je dois évaluer l'expression arithmétique avec exponentiation de chaîne, par exemple:L'évaluation expression arithmétique avec exponentiation de chaîne

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

symbole^pourrait être changement à tout autre symbole ou une chaîne, mais il doivent être écrit en de la même manière que les opérations + - * car les nombres et les opérateurs sont générés de manière aléatoire. Y a-t-il un moyen de le faire? Je ne suis pas sûr que vous pouvez écrire opération exponentiation cette façon NCalc ou Jace.Net

+0

Je ne vois aucune solution simple. Vous devez marquer l'expression et remplacer le complexe '^' par Math.Pow' .... – xanatos

+0

Il est complexe de marquer l'expression car 5+ (3 + 2)^(4 + 3) est "complexe" (les parenthèses) ... et il peut devenir encore plus complexe facilement. – xanatos

Répondre

0

Vous pouvez écrire la classe Evaluator comme ci-dessous pour exécuter du code C# dynamiquement:

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); 
    } 
} 

Ensuite, vous pouvez l'utiliser comme ça:

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

Le '^' dans C# n'est pas exponentiation, c'est xor. L'exponentiation est 'Math.Pow (...)' – xanatos