2012-01-25 15 views
1

このコードの部分を検討してください。 式の計算方法

int sum = 0; 
sum = Expression.Evaluate("1+1"); 

どこ和の値= 2

私は値を計算する式を持っていますが、私は式はその後、プログラム的に構築し、結果を評価するようにすることを望みます。私は、私が扱うクラスや名前空間が何であるか分かりません。誰でも私を助けることができます。

+0

「値を計算する式があります」。それはあなたが提供したコード断片が期待どおりに機能していることを意味しますか? '私はその表現をプログラム的に構築したいと思う。あなたは入力と出力のような例を提供できますか? – Azodious

+0

この回答はおそらくあなたが探しているものです:http://stackoverflow.com/a/53852/1106671 –

+1

[C#式を動的に評価するにはどうすればいいですか?](http://stackoverflow.com/questions)/53844/how-can-i-evaluate-ac-sharp-expression-dynamically)を使用しています。重複として閉じる投票。それが宿題であれば、助けが必要なものの詳細を記入してください。さもなければ、それは前にすでにカバーされています。 –

答えて

1

あなたは式ツリーを使用することができる:

式ツリーを、 各ノードは、例えば、式でツリー状のデータ構造では、このようなXとしてメソッド呼び出しまたはバイナリ 操作をコードを表します< y。

式ツリーで表されるコードをコンパイルして実行することができます。

  • Expression Tree Basics

  • :この問題はSystem.Reflection.Emitを使用して解決し、MSILを直接操作が、結果として得られるコードは、読み書きが困難であることができます。

    少しブラウジングした後、私はあなたがCodePlexに上逃走チェックアウトをお勧め:Fast Lightweight Expression Evaluator

    逃げるには、.NETフレームワークのための表現パーサーと評価です。 は、ランタイムでsqrt(a^2 + b^2)のような文字列式の値を計算できます。これは、カスタムコンパイラ、強く型付けされた式言語、および軽量のcodegenを使用して式 をILに直接コンパイルします。これは、式の評価が非常に速く効率的な であることを意味します。

    +0

    私はこの長い間、一度http://jint.codeplex.com/を使いました。しかし、これは試作のためだけのものでした。 –

    0

    ラムダを使用するか、System.Linq.Expressions名前空間のクラスを使用してプログラムでビルドすることで、式ツリーを構築できます。

    詳細はMSDNを参照してください。

    0

    http://ncalc.codeplex.comを見ましたか?

    これは拡張性があり、高速(独自のキャッシュを持つ)で、EvaluateFunction/EvaluateParameterイベントを処理することで、実行時にカスタム関数と変数を提供できます。例には、それが解析できる式:

    Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)"); 
    
        e.Parameters["Pi2"] = new Expression("Pi * Pi"); 
        e.Parameters["X"] = 10; 
    
        e.EvaluateParameter += delegate(string name, ParameterArgs args) 
        { 
         if (name == "Pi") 
         args.Result = 3.14; 
        }; 
    
        Debug.Assert(117.07 == e.Evaluate()); 
    

    また、ユニコード&多くのデータをネイティブに入力し処理します。あなたが文法を変更したいのであれば、それはアンラーファイルが付属しています。新しい機能をロードするためにMEFをサポートするフォークもあります。

    また、論理演算子、日付/時刻の文字列、if文もサポートしています。