-2

文字列値の比較で値を返す方法はありBooleanますか。例。If (5 > 5000) は明らかに偽の値を返します。しかし、私がやりたかったのは、「5 > 5000」が偽の値を返すようにすることです。

例。

string com = "5 > 10";

この変数が整数間の比較であるかのように値をcom返すようにする方法はありますか。false

4

6 に答える 6

5

組み込みの方法はありませんが、NCalcがここで役立ちます

NCalc.Expression expr = new NCalc.Expression("5>10");
bool b = (bool)expr.Evaluate();

パラメータを使用することもできます

NCalc.Expression expr = new NCalc.Expression("a<b");

expr.EvaluateParameter += (name, args) =>
  {
      if (name == "a") args.Result = 5;
      if (name == "b") args.Result = 10;
  };
bool b = (bool)expr.Evaluate();
于 2012-11-06T18:10:34.783 に答える
3

いいえ、これは直接行うことはできません。独自のクラスを作成するか、String クラスを拡張する必要があります。「5 < 10」などの文字列を扱うには、独自のメソッドが必要です。

「<」、「==」などの比較を示す記号を文字列で検索し、分割して比較を実行する必要があります。

基本的には、自分でやるのが唯一の方法ですが、エレガントな方法でやってみることができます。

于 2012-11-06T18:08:38.540 に答える
3

これを行う組み込みの方法はありません。

これにはいくつかの方法がありますが、1 つは単純に自分でテキストを解析することです。AC# Expression Evaluatorの記事で紹介したコードでこれを行いました。そのコードを確認することをお勧めします。

于 2012-11-06T17:53:39.347 に答える
2

直接ではありませんが (安全でない Javascript eval-execute-my-data ハックを除いて)、受け入れたい式の複雑さに応じて、自分で解析してみることができます。たとえば、これは次の文字列で機能するはずです。

var arr = com.Split('>').Select(x=>int.Parse(x.Trim())).ToArray();
return arr[0] > arr[1];

正規表現を使用してより複雑にすることもできます (テストされていませんが、動作するはずです)。

var r = new Regex(@"(\d+)\b*(<|>|=|<=|>=)\b*(\d+)")
var match = r.Match(com);
if(match.Success)
{
    var a = int.Parse(match.Captures[0]);
    var b = int.Parse(match.Captures[2]);

    switch(match.Captures[1])
    {
         case "<":
             return a < b;
         case "=":
             return a = b;
         case ">":
             return a > b;
         case "<=":
             return a <= b;
         case "<=":
             return a >= b;
    }
}

//uh-oh
throw new ArgumentException("com");
于 2012-11-06T17:54:10.640 に答える
2

短い答え:いいえ。

長い答え: > < と = を探して、自分で文字列を自由に解析してください。空白で分割し、int を解析してから評価します。括弧でも機能させたい場合は、さらに難しくなる可能性があります...

于 2012-11-06T17:50:43.343 に答える
1

FLEE の使用を検討してください:

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

FLEEを使用すると、次のようなものを使用してこれを簡単に実現できます。

        var con = new ExpressionContext();
        const string com = @"5 > 5000";
        var comparison = con.CompileDynamic(com);
        var result = comparison.Evaluate();
        MessageBox.Show(result.ToString());

HTH...

于 2012-11-06T18:25:57.270 に答える