文字列値の比較で値を返す方法はありBoolean
ますか。例。If (5 > 5000) は明らかに偽の値を返します。しかし、私がやりたかったのは、「5 > 5000」が偽の値を返すようにすることです。
例。
string com = "5 > 10";
この変数が整数間の比較であるかのように値をcom
返すようにする方法はありますか。false
文字列値の比較で値を返す方法はありBoolean
ますか。例。If (5 > 5000) は明らかに偽の値を返します。しかし、私がやりたかったのは、「5 > 5000」が偽の値を返すようにすることです。
例。
string com = "5 > 10";
この変数が整数間の比較であるかのように値をcom
返すようにする方法はありますか。false
組み込みの方法はありませんが、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();
いいえ、これは直接行うことはできません。独自のクラスを作成するか、String クラスを拡張する必要があります。「5 < 10」などの文字列を扱うには、独自のメソッドが必要です。
「<」、「==」などの比較を示す記号を文字列で検索し、分割して比較を実行する必要があります。
基本的には、自分でやるのが唯一の方法ですが、エレガントな方法でやってみることができます。
これを行う組み込みの方法はありません。
これにはいくつかの方法がありますが、1 つは単純に自分でテキストを解析することです。AC# Expression Evaluatorの記事で紹介したコードでこれを行いました。そのコードを確認することをお勧めします。
直接ではありませんが (安全でない 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");
短い答え:いいえ。
長い答え: > < と = を探して、自分で文字列を自由に解析してください。空白で分割し、int を解析してから評価します。括弧でも機能させたい場合は、さらに難しくなる可能性があります...
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...