Si j'ai une chaîne avec une expression mathématique valide telle que:
String s = "1 + 2 * 7";
Existe-t-il une bibliothèque / fonction intégrée dans .NET qui analysera et évaluera cette expression pour moi et retournera le résultat? Dans ce cas 15.
Réponses:
Vous pouvez ajouter une référence à Microsoft Script Control Library (COM) et utiliser un code comme celui-ci pour évaluer une expression. (Fonctionne également pour JScript.)
Edit - Version C #.
Edit - Le ScriptControl est un objet COM. Dans la boîte de dialogue "Ajouter une référence" du projet, sélectionnez l'onglet "COM" et faites défiler jusqu'à "Microsoft Script Control 1.0" et sélectionnez ok.
la source
Etrange que cette question célèbre et ancienne n'ait pas de réponse qui suggère le
DataTable.Compute
"truc" intégré . C'est ici.Les opérateurs arithmétiques suivants sont pris en charge dans les expressions:
Plus d'informations:
DataColumn.Expression
à Expression Syntax .la source
Pour quiconque développe en C # sur Silverlight, voici une astuce assez intéressante que je viens de découvrir qui permet d'évaluer une expression en appelant le moteur Javascript:
la source
Avez-vous vu http://ncalc.codeplex.com ?
Il est extensible, rapide (par exemple, a son propre cache) vous permet de fournir des fonctions personnalisées et des variables au moment de l'exécution en gérant les événements EvaluateFunction / EvaluateParameter. Exemples d'expressions qu'il peut analyser:
Il gère également nativement unicode et de nombreux types de données. Il est livré avec un fichier de bois de cerf si vous souhaitez changer de grammaire. Il existe également un fork qui prend en charge MEF pour charger de nouvelles fonctions.
la source
En fait, il y en a une sorte intégrée - vous pouvez utiliser l'espace de noms XPath! Bien que cela nécessite que vous reformatiez la chaîne pour confirmer avec la notation XPath. J'ai utilisé une méthode comme celle-ci pour gérer des expressions simples:
la source
Au départ, j'ai utilisé le wrapper c # pour muparser . C'était très rapide. La seule solution plus rapide que je connaisse est exprtk . Si vous recherchez d'autres solutions, vous pouvez consulter le benchmark .
Mais dans le cas de .Net, vous pouvez utiliser le support intégré pour compiler le code au moment de l'exécution. L'idée est d'avoir un fichier source "modèle" comme par exemple une ressource intégrée où vous pouvez remplacer la formule pour l'évaluation. Ensuite, vous passez ce code source de classe préparé au compilateur.
Un modèle de base pourrait ressembler à ceci:
Notez la% formule% dans laquelle l'expression sera insérée.
Pour compiler, utilisez la classe CSharpCodeProvider. Je ne veux pas mettre ici la source complète. Mais cette réponse pourrait aider:
Après avoir chargé l'assembly en mémoire, vous pouvez créer une instance de votre classe et appeler EvalCode.
la source
Encore une autre option maintenant que Roslyn est disponible:
Vous pouvez utiliser la bibliothèque CodeAnalysis.CSharp.Scripting pour cela.
paquets nuget:
la source
Récemment, j'utilisais mXparser, une bibliothèque d'analyseurs mathématiques pour .NET et JAVA. mXparser prend en charge les formules de base ainsi que les formules très sophistiquées / compliquées (y compris les variables, les fonctions, les opérateurs, l'itération et la récursivité).
https://mxparser.codeplex.com/
https://mathparser.org/
Quelques exemples d'utilisation:
Exemple 1:
Exemple 2:
Exemple 3:
Trouvé récemment - au cas où vous voudriez essayer la syntaxe (et voir le cas d'utilisation avancé), vous pouvez télécharger l' application Scalar Calculator qui est alimentée par mXparser.
Meilleures salutations
la source
Si vous avez besoin de quelque chose de très simple, vous pouvez utiliser le
DataTable
:-)la source
Je voudrais aussi jeter un œil à Jace ( https://github.com/pieterderycke/Jace ). Jace est un analyseur mathématique et un moteur de calcul hautes performances prenant en charge toutes les saveurs .NET (.NET 4.x, Windows Phone, Windows Store, ...). Jace est également disponible via NuGet: https://www.nuget.org/packages/Jace
la source
Un analyseur mathématique simple est assez facile à construire et ne nécessite que quelques lignes de code:
Prenons cet exemple flexible:
Pour activer la priorité en mettant entre parenthèses une pile de piles suffira, par exemple archivées par récursivité. Tout ce qui est entre parenthèses est mis sur une nouvelle pile. Enfin, vous pouvez prendre en charge les opérations mathématiques de manière parfaitement lisible par lambdas.
la source
100.5 + 300.5 - 100 * 10 / 100 = 30.1
vs391
la source
J'ai implémenté un analyseur d'expressions il y a quelques années et j'en avais publié une version dans GitHub et Nuget: Albatross.Expression récemment. Il contient une classe ExecutionContext qui peut évaluer un ensemble d'expressions telles que:
Il a également intégré une vérification de référence circulaire qui est utile pour éviter un débordement de pile.
la source
Vous pouvez utiliser la bibliothèque Math-Expression-Evaluator dont je suis l'auteur. Il prend en charge les expressions simples telles que
2.5+5.9
,17.89-2.47+7.16
,5/2/2+1.5*3+4.58
, les expressions avec des parenthèses(((9-6/2)*2-4)/2-6-1)/(2+24/(2+4))
et des expressions avec des variables:Vous pouvez également transmettre des paramètres en tant que variables nommées:
Il prend en charge .Net Standard 2.0 et peut donc être utilisé à partir de projets .Net Core ainsi que de .Net Full Framework et il n'a pas de dépendances externes.
la source
Évaluateur d'expression léger Flee Fast
https://flee.codeplex.com
Référence de langue
Exemple :
La sortie: 50
la source
MathNet.Symbolics
N'oubliez pas de charger
la source