2

オブジェクトごとにユーザーが独自のメジャーポイントを指定できるアプリケーションがあります。次に、これらの測定値を使用して、オブジェクトを次のように分類します。つまり、A-サービスが必要、B-サービスはX日以内にスケジュールする必要があり、C-サービスは不要ATM

ただし、これらのオブジェクトはほとんど何でもかまいません。測定値を分類に集約する方法をハードコーディングする方法はありません。ユーザーに任せる必要があります。

ユーザーがこのための独自の数式を入力する方法を提供する方法について、何か提案はありますか?ばかげている必要はありません。私たちにはそれほど多くの顧客がいないので、彼らが私たちにそれを説明できる限り、私たちは彼らを支援することができます。

4

7 に答える 7

2

C#構文を使用して記述されたテキスト式をデリゲート(または式ツリー)に変換できるオープンソースプロジェクト、DynamicExpressoを作成しました。式は、コンパイルやリフレクションを使用せずに解析され、式ツリーに変換されます。

次のように書くことができます:

var interpreter = new Interpreter();
var result = interpreter.Eval("8 / 2 + 2");

また

var interpreter = new Interpreter()
                .SetVariable("service", new ServiceExample());

string expression = "x > 4 ? service.SomeMethod() : service.AnotherMethod()";

Lambda parsedExpression = interpreter.Parse(expression, 
                        new Parameter("x", typeof(int)));

parsedExpression.Invoke(5);

私の仕事は、ScottGuの記事http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspxに基づいています。

于 2013-02-03T09:23:46.660 に答える
1

あなたの状況は、ドメイン固有言語の完璧なケースです。DSLを使用すると、「数式言語」に許容される文法を指定し、ユーザーにフィードバックを提供したり、結果を計算したりできます。

Antlrはこのための非常に優れたツールです。パーサー/レキサージェネレーターです。基本的に、Antlr独自の記述DSLで文法を指定すると、選択した言語で堅牢なレクサーとパーサーが生成されます。

たとえば、あなたの言語が簡単な計算を可能にする場合、これは(antlrのwikiからの)antlrの言語で指定される方法です:

grammar SimpleCalc;

options {
    language=CSharp2;
}

tokens {
    PLUS    = '+' ;
    MINUS   = '-' ;
    MULT    = '*' ;
    DIV = '/' ;
}

@members {
    public static void Main(string[] args) {
        SimpleCalcLexer lex = new SimpleCalcLexer(new ANTLRFileStream(args[0]));
        CommonTokenStream tokens = new CommonTokenStream(lex);

        SimpleCalcParser parser = new SimpleCalcParser(tokens);

        try {
            parser.expr();
        } catch (RecognitionException e)  {
            Console.Error.WriteLine(e.StackTrace);
        }
    }
}

/*------------------------------------------------------------------
 * PARSER RULES
 *------------------------------------------------------------------*/

expr    : term ( ( PLUS | MINUS )  term )* ;

term    : factor ( ( MULT | DIV ) factor )* ;

factor  : NUMBER ;


/*------------------------------------------------------------------
 * LEXER RULES
 *------------------------------------------------------------------*/

NUMBER  : (DIGIT)+ ;

WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+    { $channel = HIDDEN; } ;

fragment DIGIT  : '0'..'9' ;

DSL全般について詳しくは、こちらをご覧ください。

于 2009-10-29T15:01:16.640 に答える
1

逃げる表現評価者

使用するのに有効な変数のリストをユーザーに提供し、ユーザーが独自の式を考え出すようにすることができます。次に、すべての式、変数名、および値をFleeに渡し、すべての式を値またはtrue/falseに解決します。

于 2009-10-29T14:49:24.090 に答える
1

SpreadsheetGearfor.NETは良い選択かもしれません。SpreadsheetGearは、ほとんどのユーザーがすでに知っている言語(Excel)で数式を受け入れて計算します。SpreadsheetGearには、Windowsフォームスプレッドシートコントロールが含まれています。ASP.NETまたはWebサービスを実行している場合は、ライブラリとして使用できます。

ここで簡単なASP.NET計算サンプルを見ることができます。または、WinFormsコントロールを試してみたい場合は、ここから無料試用版をダウンロードしてください。

免責事項:私はSpreadsheetGearLLCを所有しています

于 2009-10-29T15:09:11.997 に答える
0

あなたは、オブジェクトが「ほとんど何でも」あり得ると言います。測定点もほとんど何でもかまいませんか?おそらく、測定は問題のオブジェクトの定義されたプロパティに制限されます。その場合、ユーザーが反射によって検出されたオブジェクトのプロパティに基づいて計算を実行できるウィザードのようなエディタを公開できます。問題を制限するために行っていることの1つは、1からNの状態ではなく、3つのエンドポイントを測定に適用しているように見えることです。

最後の提案ですが、十分な柔軟性を得るには、測定するオブジェクトにバインドする独立した測定オブジェクトモデルが必要になると思います。

測定に排他性を適用することはあなたにとってどれほど重要ですか?重複する状態を定義することからユーザーを保護することは、おそらくこれの最も難しい部分です。あなたの説明から、まったく異なる測定値が異なる状態にアタッチするのに有効であるように思われるからです。

また、オブジェクトをポーリングして測定値を計算し、オブジェクトの状態を定義する方法を知っていますか?

とても一般的に話して申し訳ありませんが、実際にはこの時点であなたの質問はかなり一般的です。幸運を。

于 2009-10-29T15:00:30.157 に答える
0

System.Linq.Expressionsで.NET3.5式を使用する必要があります。Scott Guは、文字列を評価して式ツリーに変換できる動的式APIを提供しました。これは、式の内容を調べるためにコードで評価するか、実行用にコンパイルすることができます。

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

于 2009-10-29T14:52:26.587 に答える
0

ユーザーはオブジェクトに関する知識を使用して、システムに入力するときにオブジェクトをどのカテゴリに入れるかを決めることができますか?より多くの情報が必要だと思いますが、ユーザーがどのメジャーポイントがどのカテゴリを決定するかを定義できる場合、カテゴリを選択するだけではいけませんか?

于 2009-10-29T15:07:47.733 に答える