重複の可能性:
.NETに文字列数学エバリュエーターはありますか?
C#を使用して文字列式を整数値に変換する
数式を評価するための最良かつ最短の方法
c#文字列「3 *(4 + 2)」を評価するyield int 18
ここに示されているのとは異なる方法で(2-3 / 4 * 12)のような数式を計算する方法はありますか?
重複の可能性:
.NETに文字列数学エバリュエーターはありますか?
C#を使用して文字列式を整数値に変換する
数式を評価するための最良かつ最短の方法
c#文字列「3 *(4 + 2)」を評価するyield int 18
ここに示されているのとは異なる方法で(2-3 / 4 * 12)のような数式を計算する方法はありますか?
DataTable には、これを記述できるComputeメソッドがあります。
var result = new DataTable().Compute("2-3/4*12", null);
これは単純な数式に限定されることに注意してください。
その他のオプションは、DLR で IronPython や IronRuby などの動的言語を使用することです。この投稿をチェックしてください:
var engine = new IronPython.Hosting.PythonEngine();
double result = pythonEngine.EvaluateAs<double>("2-3/4*12");
GitHub で NCalc ライブラリを確認することもできます。
いくつかの興味深いオプションを利用できます。
NCalc - ANTLR で構築された C# Lexer パーサー。これにより、テキストが解析され、パラメーター/変数に値を割り当てることができます。インタープリターは C# であるため、アプリ ドメインなどに追加のアセンブリを読み込む必要はありません。
JINT - 文法を作成するために ANTLR を使用して ECalc の同じ作成者によって構築された C# ベースの Javascript インタープリター。これは現在ベータ版ですが、計算と関数でうまく機能します。
CS-Script.Net - サイトから: 「CS-Script は、プログラミング言語として ECMA 準拠の C# を使用する CLR (Common Language Runtime) ベースのスクリプト システムです。CS-Script は現在、CLR (.NET 2.0/ 3.0/3.5)、Mono のサポートは限定的です。」スクリプトをロードし、アセンブリをメモリ内に作成し、アプリ ドメインを分離します。これは非常に堅牢で、私は組み込みスクリプト用に本番環境で使用しています。
FLEE (Fast Lightweight Expression Evaluator) を確認してください - http://flee.codeplex.com/
Flee は、.NET フレームワーク用の式パーサーおよびエバリュエーターです。実行時に sqrt(a^2 + b^2) などの文字列式の値を計算できます。カスタム コンパイラ、厳密に型指定された式言語、および軽量の codegen を使用して、式を直接 IL にコンパイルします。これは、式の評価が非常に高速で効率的であることを意味します。式に基づいて画像を生成できるデモを試して、自分の目で確かめてください。
無料で高速で、いくつかのプロジェクトで使用しました。
注意: この回答は完全を期すためのものです。決してお勧めできる方法ではありません。
(非推奨の) JScript ライブラリに C# から直接アクセスできます。つまり、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 = "2 - 3 / 4 * 12";
Console.WriteLine(JScriptEval(expr)); // displays -7
// ...
public static VsaEngine _engine = VsaEngine.CreateEngine();
public static double JScriptEval(string expr)
{
// error checking etc removed for brevity
return double.Parse(Eval.JScriptEvaluate(expr, _engine).ToString());
}
間違いなく「推奨しない」カテゴリですが、完全を期すために、簡単に接続できるデータベースがある場合は、クエリ「SELECT式」を送信してください。
ええと、それは非常に行き過ぎた解決策のようです。
本当に必要なのは単純なパーサーです。
文字列をトークンに分割してから評価する必要があります。これにより、研究を開始できます。 http://en.wikipedia.org/wiki/Parsing#Overview_of_process
最適なオプションは、式ツリーを構築することです。最初に式のツリーを構築し、次に http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx を使用してコンパイルし、次に http://msdn.microsoft.com/を使用して簡単にコンパイルできますen-us/library/bb356928(v=VS.100).aspx