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]

ASP.NET Core und Angular Komplett für .NET-Entwickler

Sie  lernen in drei (3) Tagen wie man mit  ASP.NET Core und den Technologien  MVC, Entity Framework, WebAPI und  Razor professionelle sowie moderne  Web-Anwendungsarchitekturen aufbaut.  Die Schulung ist der perfekte  Einstieg um insbesondere datengetriebene  und präsentationsorientierte  Applikationen auf Basis der robusten und  skalierbaren ASP.NET Core  Plattform zu erstellen. Nach der Veranstaltung kennen Sie die Konzepte von Angular und können Angular in neue und bestehende ASP.NET-Anwendungen einsetzen.

Visual Studio Team Foundation Server 2017/2015 (TFS) für Entwickler - Kompakt

Nach Teilnahme an dieser Schulung kennen Sie alle wesentlichen Funktionen des TFS für Entwickler. Sie setzen Software-Entwicklung mit dem Visual Studio Team Foundation Server erfolgreich um.

        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!