Wenn ich eine Zeichenfolge mit einem gültigen mathematischen Ausdruck habe, wie z.
String s = "1 + 2 * 7";
Gibt es in .NET eine integrierte Bibliothek / Funktion, die diesen Ausdruck für mich analysiert und auswertet und das Ergebnis zurückgibt? In diesem Fall 15.
Antworten:
Sie können einen Verweis auf die Microsoft Script Control Library (COM) hinzufügen und Code wie diesen verwenden, um einen Ausdruck auszuwerten. (Funktioniert auch für JScript.)
Bearbeiten - C # -Version.
Bearbeiten - Das ScriptControl ist ein COM-Objekt. Wählen Sie im Dialogfeld "Referenz hinzufügen" des Projekts die Registerkarte "COM", scrollen Sie nach unten zu "Microsoft Script Control 1.0" und wählen Sie "OK".
quelle
Seltsam, dass diese berühmte und alte Frage keine Antwort hat, die den eingebauten
DataTable.Compute
"Trick" nahe legt . Hier ist es.Die folgenden arithmetischen Operatoren werden in Ausdrücken unterstützt:
Weitere Informationen:
DataColumn.Expression
unter Ausdruckssyntax .quelle
Für alle, die in C # auf Silverlight entwickeln, ist hier ein hübscher Trick, den ich gerade entdeckt habe und der die Auswertung eines Ausdrucks durch Aufrufen der Javascript-Engine ermöglicht:
quelle
Haben Sie http://ncalc.codeplex.com gesehen ?
Es ist erweiterbar, schnell (z. B. hat es einen eigenen Cache) und ermöglicht es Ihnen, zur Laufzeit benutzerdefinierte Funktionen und Variablen bereitzustellen, indem Sie EvaluateFunction / EvaluateParameter-Ereignisse verarbeiten. Beispielausdrücke, die analysiert werden können:
Es behandelt auch Unicode und viele Datentypen nativ. Es wird mit einer Geweihdatei geliefert, wenn Sie die Grammatik ändern möchten. Es gibt auch eine Gabel, die MEF unterstützt, um neue Funktionen zu laden.
quelle
Eigentlich gibt es eine Art eingebauten - Sie können den XPath-Namespace verwenden! Obwohl es erforderlich ist, dass Sie die Zeichenfolge neu formatieren, um sie mit der XPath-Notation zu bestätigen. Ich habe eine Methode wie diese verwendet, um mit einfachen Ausdrücken umzugehen:
quelle
Anfangs habe ich den c # -Wrapper für Muparser verwendet . Das war sehr schnell. Die einzige schnellere Lösung, die ich kenne, ist exprtk . Wenn Sie nach anderen Lösungen suchen, können Sie den Benchmark überprüfen .
Im Fall von .Net können Sie jedoch die integrierte Unterstützung verwenden, um Code zur Laufzeit zu kompilieren. Die Idee ist, eine "Vorlagen" -Quelldatei als eingebettete Ressource zu haben, in der Sie die Formel für die Auswertung ersetzen können. Dann übergeben Sie diesen vorbereiteten Klassenquellcode an den Compiler.
Eine grundlegende Vorlage könnte folgendermaßen aussehen:
Beachten Sie die% -Formel%, in die der Ausdruck eingefügt wird.
Verwenden Sie zum Kompilieren die Klasse CSharpCodeProvider. Ich möchte hier nicht die vollständige Quelle eintragen. Aber diese Antwort könnte helfen:
Nachdem Sie die In-Memory-Assembly geladen haben, können Sie eine Instanz Ihrer Klasse erstellen und EvalCode aufrufen.
quelle
Eine weitere Option, sobald Roslyn verfügbar ist:
Hierfür können Sie die CodeAnalysis.CSharp.Scripting-Bibliothek verwenden.
Nuget-Pakete:
quelle
Kürzlich habe ich mXparser verwendet, eine Mathe-Parser-Bibliothek für .NET und JAVA. mXparser unterstützt sowohl grundlegende als auch sehr ausgefallene / komplizierte Formeln (einschließlich Variablen, Funktionen, Operatoren, Iteration und Rekursion).
https://mxparser.codeplex.com/
https://mathparser.org/
Einige Anwendungsbeispiele:
Beispiel 1:
Beispiel 2:
Beispiel 3:
Kürzlich gefunden - falls Sie die Syntax ausprobieren möchten (und den erweiterten Anwendungsfall sehen möchten), können Sie den Skalar herunterladen Calculator- App , die von mXparser unterstützt wird.
Freundliche Grüße
quelle
Wenn Sie eine sehr einfache Sache brauchen, können Sie die
DataTable
:-) verwendenquelle
Ich würde mir auch Jace ansehen ( https://github.com/pieterderycke/Jace ). Jace ist eine leistungsstarke Mathematik-Parser- und Berechnungs-Engine, die alle .NET-Varianten (.NET 4.x, Windows Phone, Windows Store, ...) unterstützt. Jace ist auch über NuGet erhältlich: https://www.nuget.org/packages/Jace
quelle
Ein einfacher Mathe-Parser ist recht einfach zu erstellen und erfordert nur wenige Codezeilen:
Nehmen Sie dieses flexible Beispiel:
Um die Priorität durch Klammern zu aktivieren, reicht ein Stapel von Stapeln aus, z. B. durch Rekursion archiviert. Alles zwischen Klammern wird auf einen neuen Stapel gelegt. Schließlich können Sie mathematische Operationen von Lambdas auf eine sauber lesbare Weise unterstützen.
quelle
100.5 + 300.5 - 100 * 10 / 100 = 30.1
vs391
quelle
Ich habe vor einigen Jahren einen Ausdrucksparser implementiert und kürzlich eine Version davon in GitHub und Nuget veröffentlicht: Albatross.Expression . Es enthält eine ExecutionContext-Klasse, die eine Reihe von Ausdrücken auswerten kann, z.
Es hat auch eine Rundschreiben-Referenzprüfung eingebaut, die nützlich ist, um einen Stapelüberlauf zu vermeiden.
quelle
Sie können die Math-Expression-Evaluator- Bibliothek verwenden, deren Autor ich bin. Es unterstützt einfache Ausdrücke wie
2.5+5.9
,17.89-2.47+7.16
,5/2/2+1.5*3+4.58
, Ausdrücke mit Klammern(((9-6/2)*2-4)/2-6-1)/(2+24/(2+4))
und Ausdrücke mit Variablen:Sie können Parameter auch als benannte Variablen übergeben:
Es unterstützt .Net Standard 2.0 und kann daher sowohl in .Net Core- als auch in .Net Full Framework-Projekten verwendet werden. Es gibt keine externen Abhängigkeiten.
quelle
Flee Fast Lightweight Expression Evaluator
https://flee.codeplex.com
Sprach-Referenz
Beispiel:
Die Ausgabe: 50
quelle
MathNet.Symbolics
Vergiss nicht zu laden
quelle