ベストと数式
答えて
Thomasの回答に加えて、実際にはC#から(廃止予定の)JScriptライブラリに直接アクセスすることができます。つまり、JScriptのeval
機能に相当するものを使用できます。
using Microsoft.JScript; // needs a reference to Microsoft.JScript.dll
using Microsoft.JScript.Vsa; // needs a reference to Microsoft.Vsa.dll
// ...
string expr = "7 + (5 * 4)";
Console.WriteLine(JScriptEval(expr)); // displays 27
// ...
public static double JScriptEval(string expr)
{
// error checking etc removed for brevity
return double.Parse(Eval.JScriptEvaluate(expr, _engine).ToString());
}
private static readonly VsaEngine _engine = VsaEngine.CreateEngine();
恥ずかしがり屋のためのキャレット^をサポートしていません。 –
確かに可能です。基本的にはCodeSnippetCompileUnitクラスです。 私はいくつかの使用コード例を書いています。これらの名前空間を含める必要があります:
- System.CodeDom.Compiler;
- System.CodeDom;
- Microsoft.CSharp;
- System.Reflection;
は、ここでは、コードです:
string source = @"
class MyType
{
public static int Evaluate(<!parameters!>)
{
return <!expression!>;
}
}
";
string parameters = "int a, int b, int c";
string expression = "a + b * c";
string finalSource = source.Replace("<!parameters!>", parameters).Replace("<!expression!>", expression);
CodeSnippetCompileUnit compileUnit = new CodeSnippetCompileUnit(finalSource);
CodeDomProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
CompilerResults results = provider.CompileAssemblyFromDom(parameters, compileUnit);
Type type = results.CompiledAssembly.GetType("MyType");
MethodInfo method = type.GetMethod("Evaluate");
// The first parameter is the instance to invoke the method on. Because our Evaluate method is static, we pass null.
int result = (int)method.Invoke(null, new object[] { 4, -3, 2 });
は、「パラメータ」と何によって「表現」を置き換え、そしてあなた自身に、一般的な式評価を持っています。
results.CompiledAssemblyでFileNotFoundExceptionが発生した場合、スニペットのコンパイルに失敗しました。
また、System.CodeDom.CodeSnippetExpressionクラスも参照してください。式をより具体的に読むために使用されますが、式自体はコンパイルできません。そのため、より多くのCodeDomを使用して、その周囲の作業クラスおよびメソッドを構築する必要があります。これは、生成しているクラスの種類をプログラムで操作できるようにする場合に便利です。 CodeSnippetCompileUnitは、ワーキングクラス全体を一度に生成するのはいいですが(例の方が簡単ですが)、不便な文字列操作をしなければならない場合は、それを操作してください。
が最適です。 –
ncalcを使ったこのソリューションのパフォーマンスは非常に高く、グラファとしてテストしました。多変数関数の中には500sを超えるものがありました。これにより、400,000ポイントを超える5s以下の描画ができました。素晴らしい解決策! –
コンパイラサービスを使用するのはシンプルで効率的な解決方法ですが、実際には何かを実行する可能性があるため、ユーザーが式を入力すると深刻なセキュリティ問題が発生します。
さらに安全性の高い別の非常に簡単なソリューションがあります.JScript Eval
の機能を活用してください。あなただけのこれらの手順を実行する必要があります。
がJsMath.jsという名前のjsファイルを作成します。
class JsMath
{
static function Eval(expression : String) : double
{
return eval(expression);
};
}
クラスライブラリにそれをコンパイルします。
jsc /t:library JsMath.js
リファレンスあなたのC#プロジェクトでJsMathライブラリをそれを次のように使用してください:
double result = JsMath.Eval(expression);
私にとってVici.Parserは非常にうまく動作します:check it out here、それは私が今までに見つけた最も柔軟な表現パーサーです。
例が利用可能であり、非常に良いサポートは開発者によってあります(私たちは、SQL Serverデータベースが提供するデータを、「人間が読めるのビジネスルールを設定するためにそれを使用しました)(ウェブサイトのを確認してくださいフォーラム)。
非常に興味深いです。 – NotMe
@Roel - リンクが死んでいます。 –
私はこれがすべての最良の方法だと思います。 Petar Repac's answerは素晴らしいです。 のDataColumnオブジェクトの「式」引数を使用すると、信じられないほど簡単に話題を解決します
static double Evaluate(string expression)
{
var loDataTable = new DataTable();
var loDataColumn = new DataColumn("Eval", typeof(double), expression);
loDataTable.Columns.Add(loDataColumn);
loDataTable.Rows.Add(0);
return (double)(loDataTable.Rows[0]["Eval"]);
}
- 1. ベスト定数c規約
- 2. 数式と数式パーサーアルゴリズム
- 3. ASP.NET CoreとAngular2のベスト・アプローチ
- 4. VB6と.netアプリケーションのベストIPC
- 5. WatiNのベスト・オートメーション・アプローチとは
- 6. ベスト・アプローチドッカー
- 7. ベスト・アプローチ:MVCの複数のコンテンツ・プレース・ホールダー
- 8. ベスト2D C++ API?
- 9. ベストEclipse UMLプラグイン
- 10. ベスト言語
- 11. GeoFencingベストStratigies
- 12. ベストPHPデータグリッド
- 13. ベストPHP QAツール
- 14. ベストな場所
- 15. ベストな方法
- 16. マテリアライズド・ビュー - ベスト・プラクティス
- 17. ベストExtJs 4テーマリソース
- 18. ベストSVNバックエンドベンチマーク
- 19. ベストIoTデータベース?
- 20. ベストPHPワークフロー
- 21. ベストC#のファイルクラステキストファイル
- 22. ベストTシャツカタログウェブサイト
- 23. ベストjQueryのテキストエディタ
- 24. ベストASP.NETアプリケーションデプロイメントメソッド
- 25. ベスト・ソケット・ネーミング・プラクティス
- 26. ベスト格言
- 27. ベストPHP/MYSQLフローチャートジェネレータ?
- 28. ベスト画像スケーリングライブラリ
- 29. ベストApache Antテンプレート
- 30. Android BackupManagerと私のアプリケーションdb:ベスト・アプローチ
私はしばらく前に同様の質問をしました。それらの答えのいくつかを見たいかもしれません:http://stackoverflow.com/questions/234217/is-it-possible-to-translate-a-user-entered-mathematical-equation-into-c-code-at – raven
"static/pre-compiled"コードの残りの部分で使用されている変数にリンクする方法を見つけましたか? –