0

このような式を生成しようとしていますが、これは単なるサンプルです。

A + B + C > D - A

ここで、A、B、C、D などは、メモリ内でアクセスするシート (Excel シートなど) の列名です。

A + B + C > D - A上記のように、ユーザーがセルに追加できる値の種類を決定するルールを生成する必要があります。

現在、これは私が始めた方法です:

string toValidate = "A + B + C > D + E - A";
string lhs = "", rhs = "";
string[] comparisonOperators = new string[] { "=", ">", "<", "<>", "!=" };
char[] arithmeticOperators = { '+', '-', '/', '*' };
toValidate = toValidate.Replace(@" ", "");  
for (int i = 0; i < comparisonOperators.Length; i++)
{
    if (toValidate.Contains(comparisonOperators[i]))
    {
        operatorIndex = toValidate.IndexOf(comparisonOperators[i]);
        break;
    }
}
lhs = toValidate.Substring(0, operatorIndex);
rhs = toValidate.Substring(operatorIndex + 1);
string[] columnLhsList = lhs.Split(arithmeticOperators);
string[] columnRhsList = rhs.Split(arithmeticOperators);

ただし、上記のコードでは文字列が aslhsrhsあり、演算子である場合でも>、シート自体に式を適用する方法を理解できません。どの列にどの演算子が関連付けられているかを知る必要があるだけです。

個々の列名がありますが、それらの前に演算子がないため、たとえば、

+別のケースでは前A -に。A

上記を解析する方法を教えてください。

4

2 に答える 2

3

ただし、このような単純な数式パーサーを自分で作成したい場合は、非常に楽しい質問です。

この記事は非常に明確に書かれており、理解しやすいため、この記事をチェックすることをお勧めします。

入換場アルゴリズム

于 2013-07-11T10:29:54.933 に答える
3

個人的には、独自の数式パーサーを作成しようとはしませんでした。代わりに、 CodePlex.com のNCalcなど、利用可能なものの 1 つを使用します (実際に使用しました) 。

これらのツールを使用すると、書くのと同じくらい簡単です

Expression e = new Expression("2 + 3 * 5");
Debug.Assert(17 == e.Evaluate());

数式を評価します。

通常、このようなライブラリは非常に堅牢で、十分にテストされており、豊富な機能セットを備えています。このような高品質のライブラリを自分で作成するには、(もしあったとしても) 何年もかかるでしょう。

NCalc Web サイトをさらに引用するには、次のような変数を使用することもできます。

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());
于 2013-07-11T10:27:37.323 に答える