Espressione matematica approfondita

C’è un modo semplice per analizzare una semplice espressione matematica rappresentata come una stringa come (x + (2 * x) / (1-x)), fornire un valore per x e ottenere un risultato?

Ho esaminato il VSAEngine per diversi esempi online, tuttavia, sto ricevendo un avviso che questo assembly è stato deprecato e non usarlo.

Se fa delle differenze, sto usando .NET 4.0.

Puoi provare a utilizzare DataTable.Compute .

Uno correlato è DataColumn.Expression .

Scopri anche: Fare matematica in vb.net come Eval in javascript

Nota: non li ho usati io stesso

Esorto caucanvas nei confronti della scelta di un valutatore di espressioni generiche esistente su un valutatore matematico appositamente costruito. La ragione di ciò è che i valutatori di espressioni non si limitano solo alla matematica. Un individuo intelligente potrebbe usarlo per creare un’istanza di qualsiasi tipo nel framework e chiamare qualsiasi metodo sul tipo, e questo gli permetterebbe di fare alcune cose decisamente sgradite. Ad esempio: new System.Net.WebClient().DownloadFile("illegalchildpornurl", "C:\openme.gif") valuterà proprio bene nella maggior parte di questi, e farà solo quello che sembra (e ti farà diventare un felon allo stesso tempo).

Questo non significa non cercare qualcosa che è già stato scritto. Significa solo stare attenti. Ne vuoi uno che faccia matematica, e solo matematica. La maggior parte di ciò che è già là fuori non è così schizzinoso.

Recentemente stavo usando mXparser, che è una libreria di parser matematico. Ti dà molta flessibilità, come variabili, funzioni, costanti, operatori. Di seguito sono riportati alcuni esempi di utilizzo:

Esempio 1: formula semplice

 Expression e = new Expression("1 + pi"); double v = e.calculate(); 

Esempio 2: formula con variabili, funzioni, ecc.

 Argument x = new Argument("x = 2"); Constant a = new Constant("a = sin(10)"); Function f = new Function("f(t) = t^2"); Expression e = new Expression("2*x + a - f(10)", x, a, f); double v = e.calculate(); 

https://mxparser.codeplex.com/

http://mathparser.org/

I migliori saluti

Vorrei anche dare un’occhiata a Jace ( https://github.com/pieterderycke/Jace ). Jace è un parser matematico ad alte prestazioni e un motore di calcolo che supporta tutti gli ambienti .NET (.NET 4.x, Windows Phone, Windows Store, …). Jace è disponibile anche tramite NuGet: https://www.nuget.org/packages/Jace

Ecco un modo per farlo. Questo codice è scritto in Java. Nota che adesso non gestisce i numeri negativi, ma puoi aggiungerlo.

 public class ExpressionParser { public double eval(String exp, Map vars){ int bracketCounter = 0; int operatorIndex = -1; for(int i=0; i 

}

Devi importare java.util.Map.

Ecco come uso questo codice:

  ExpressionParser p = new ExpressionParser(); Map vars = new HashMap(); vars.put("x", 2.50); System.out.println(p.eval(" 5 + 6 * x - 1", vars)); 

Un’altra opzione che potresti voler esaminare è la funzionalità di valutazione delle espressioni di Spring.NET Framework. Può fare molto di più della matematica, anche.

Tuttavia, l’intero framework Spring.NET potrebbe essere un po ‘eccessivo per le tue esigenze se non hai bisogno del resto della funzionalità.

Correlato: parser di espressioni di equazioni con precedenza .

Come ho risposto in questo thread ( miglior Parser matematico Free C # utilizzando variabili, funzioni definite dall’utente, operatori personalizzati ), è ansible utilizzare Mathos Parser , che è ansible semplicemente incollare nel codice sorgente.

  Mathos.Parser.MathParser parser = new Mathos.Parser.MathParser(); string expr = "(x+(2*x)/(1-x))"; // the expression decimal result = 0; // the storage of the result parser.LocalVariables.Add("x", 41); // 41 is the value of x result = parser.Parse(expr); // parsing Console.WriteLine(result); // 38.95 

Ti raccomando di usare MEEL per questo.

 // parse string to IExpression (symbolic type) IExpression expression = BaseExpression.Parse("(x+(2*x)/(1-x))"); // create your own collection for attributes var attributes = new MathAttributeCollection(); // create local variable named "x" with value 5 var attributeX = new ScalarAttrInt("x") {Value = new ScalarConstInt(5)}; attributes.Add(attributeX); // execute math expression where x=5 var result = expression.Execute(attributes); MessageBox.Show(result.GetText()); // result: 2.5