web-dev-qa-db-ja.com

C#数学計算機

25
gapo

DataTableには Compute メソッドがあり、これを記述できます。

var result = new DataTable().Compute("2-3/4*12", null);

これは単純な数式に限定されていることに注意してください。

その他のオプションは、IronPythonやIronRubyなどのDLRで動的言語を使用することです。チェックアウト この投稿

var engine = new IronPython.Hosting.PythonEngine();
double result = pythonEngine.EvaluateAs<double>("2-3/4*12");

GitHubのNCalcライブラリ も確認できます。

66
Darin Dimitrov

あなたが利用できるいくつかの興味深いオプションがあります。

  1. NCalc -C# ANTLRで構築されたレクサーパーサー 。これによりテキストが解析され、パラメータ/変数に値を割り当てることができます。インタープリターはC#であるため、アプリドメインなどに追加のアセンブリを読み込む必要はありません。

  2. [〜#〜] jint [〜#〜] -文法を作成するためにANTLRを使用してECalcの同じ作者が作成したC#ベースのJavaScriptインタープリター。これは現在ベータ版ですが、計算と関数でうまく動作します。

  3. CS-Script.Net -サイトから:「CS-Scriptは、プログラミング言語としてECMA準拠のC#を使用するCLR(共通言語ランタイム)ベースのスクリプトシステムです。CS-Scriptは現在、Microsoftの実装をターゲットにしています。 CLR(.NET 2.0/3.0/3.5)で、Monoでのサポートが制限されています。」ロードスクリプトおよびメモリ内のアセンブリと個別のアプリドメインを作成します。それは非常に堅牢であり、私は本番環境で組み込みスクリプトを使用します。

8
David Robbins

FLEE(Fast Lightweight Expression Evaluator)を確認してください- http://flee.codeplex.com/

Fleeは、.NETフレームワークの式パーサーおよびエバリュエーターです。実行時にsqrt(a ^ 2 + b ^ 2)などの文字列式の値を計算できます。カスタムコンパイラ、厳密に型指定された式言語、軽量のcodegenを使用して、式を直接ILにコンパイルします。つまり、式の評価は非常に高速で効率的です。表現に基づいて画像を生成できるデモを試してみて、自分の目で確かめてください。

それは無料で高速で、いくつかのプロジェクトで使用しました。

4
Alex Warren

間違いなく「お勧めしない」カテゴリにありますが、完全を期すために、便利に接続できるデータベースがあれば、それにクエリ「SELECT expression "を送信します。

3
Richard Dunlap

注:この回答は完全を期すためのものです。私がお勧めする方法ではありません。

(非推奨の)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());
}
3
LukeH

ええと、それは非常に上のソリューションのようです。

あなたが本当に欲しいのはシンプルなパーサーです。

文字列をトークンに分解して評価する必要があります。これにより、調査を開始できます。 http://en.wikipedia.org/wiki/Parsing#Overview_of_process

0

最良のオプションは、式ツリーを構築することです。最初に式のツリーを作成し、次に http://msdn.Microsoft.com/en-us/library/system.linq.expressions.aspx 使用して、簡単にコンパイルできます http://msdn.Microsoft.com/en-us/library/bb356928(v=VS.100).aspx

0
Andrey