26

重複の可能性:
.NETに文字列数学エバリュエーターはありますか?
C#を使用して文字列式を整数値に変換する
数式を評価するための最良かつ最短の方法
c#文字列「3 *(4 + 2)」を評価するyield int 18

ここに示されているのとは異なる方法で(2-3 / 4 * 12)のような数式を計算する方法はありますか?

http://www.c-sharpcorner.com/uploadfile/mgold/codedomcalculator08082005003253am/codedomcalculator.aspx

4

7 に答える 7

70

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 ライブラリを確認することもできます。

于 2010-05-18T16:24:56.400 に答える
8

いくつかの興味深いオプションを利用できます。

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

  2. JINT - 文法を作成するために ANTLR を使用して ECalc の同じ作成者によって構築された C# ベースの Javascript インタープリター。これは現在ベータ版ですが、計算と関数でうまく機能します。

  3. CS-Script.Net - サイトから: 「CS-Script は、プログラミング言語として ECMA 準拠の C# を使用する CLR (Common Language Runtime) ベースのスクリプト システムです。CS-Script は現在、CLR (.NET 2.0/ 3.0/3.5)、Mono のサポートは限定的です。」スクリプトをロードし、アセンブリをメモリ内に作成し、アプリ ドメインを分離します。これは非常に堅牢で、私は組み込みスクリプト用に本番環境で使用しています。

于 2010-05-18T16:39:34.607 に答える
4

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

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

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

于 2010-05-18T16:29:08.437 に答える
4

注意: この回答は完全を期すためのものです。決してお勧めできる方法ではありません。

(非推奨の) 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());
}
于 2010-05-18T16:39:07.917 に答える
3

間違いなく「推奨しない」カテゴリですが、完全を期すために、簡単に接続できるデータベースがある場合は、クエリ「SELECT」を送信してください。

于 2010-05-18T17:17:41.923 に答える
0

ええと、それは非常に行き過ぎた解決策のようです。

本当に必要なのは単純なパーサーです。

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

于 2010-05-18T16:27:28.767 に答える
0

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

于 2010-05-18T16:28:39.797 に答える