Feedback

C# - Math Evaluator

Veröffentlicht von am 04.11.2015
(1 Bewertungen)
Ausführung von einfachen mathematischen Ausdrücken durch inline Compilierung.

Verwendung:

var val = Calculate("10 + 20 * 2 / 20");
Console.WriteLine(val);

var val2 = Calculate("(10 + 20) * 2 / 2");
Console.WriteLine(val2);
GFU-Schulungen  [Anzeige]

VB.NET Komplett

Sie stehen vo der Aufgabe, individuelle Anwendungen für Windows zu schreiben. Hier ist VB.NET die optimale Sprache. Sie erlernt sich recht leicht und passt sich komplett in die .NET Umgebung von Microsoft ein. Nach der Schulung entwickeln Sie anwenderfreundliche Programme in VB.NET . Mit den objektorientierten Modellen in VB.NET erzeugen Sie außerdem wiederverwendbare Komponenten.

VB.NET 2017/2015/2013 Komplett

Ziel des Seminars ist der flexible Umgang mit VB.NET, wie z.B. die damit verbundene eigenständige Entwicklung von Programmen oder das Verwenden von Datenbanken.

        static double Calculate(string expression)
        {
            var options = new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } };
            var provider = new CSharpCodeProvider();
            
            var dlls = new[] { "mscorlib.dll", "System.Core.dll" };
            var tempFile = Path.GetTempFileName() + ".dll";
            var param = new CompilerParameters(dlls, tempFile, true);
            
            param.GenerateInMemory = true;
            param.GenerateExecutable = false;

            var code =  "using System; " +
                        "public class Calculator { " + 
                        "  public static double Run() { " + 
                        "    return " + expression + "; " + 
                        "  } " + 
                        "}";

            CompilerResults result = provider.CompileAssemblyFromSource(param, code);

            if(result.Errors.Count > 0 ){
                var errors = string.Join(" -> ", result.Errors.Cast<CompilerError>().Select(e => e.ErrorText));
                throw new ArgumentException("expression is invalid. Compiler Result: " + errors);
            }
            
            var type = result.CompiledAssembly.GetTypes().First(t => t.Name == "Calculator");
            var calcResult = (double)type.GetMethod("Run").Invoke(null, null);

            return calcResult;
        }
Abgelegt unter math, eval.

2 Kommentare zum Snippet

diub schrieb am 08.11.2015:
Danke dafür. Ich habe es für meine Bedürfnisse angepasst:

- 'dynamic' statt 'double', damit lässt sich Alles verarbeiten
- als Klasse für die Initialsierungen, damit die nicht ständig neu gemacht werden müssen
- StringBuilder genutzt um die Expression zusammenzusetzen
- Bei Fehler Rückgabe wert von 'Null' statt eine Ausnahme

Wichtig: die Debuginformation nicht(!) einschließen, sonst klappt es dann nicht mit allen Typen.

Bei Interesse Nachricht an mich.
v_b schrieb am 08.11.2015:
Da werd ich bekloppt!

Ich habe gerade nachträglich über den Wettbewerb und meine Einreichung geblogt. Da checke ich doch danach meine Mails und eine führt mich hierhin :)

Würde gerne dein Snippet sehen und wenn du kein Problem damit hast, dann als Update auf dem Blog veröffentlichen:
http://dev-things.net

Einfach melden, würde mich freuen!

PS: schon gevoted? :)
 

Logge dich ein, um hier zu kommentieren!