3

レポートの内容を制御するいくつかの引数を使用して文字列を解析する必要があるレポート サーバーがあります。

これを支援するために、パーサー ライブラリ sprache を使用しています。私が立ち往生していることを除いて、すべてが正常に機能しています。

今日、昨日、先週、先月、なし、またはカスタムの値のいずれかになる時間フィルターがあります。

私にいくらかの悲しみを与えているのは習慣です。他のすべては単純な文字列です。Custom には、後で from プロパティと to プロパティもあります。

   private static readonly Parser<DataFilterEntity> TimeFilter =
        from filter in Parse.String("today").Return(DataFilterEntity.Today)
            .Or(Parse.String("yesterday").Return(DataFilterEntity.Yesterday)
            .Or(Parse.String("last week").Return(DataFilterEntity.LastWeek)
            .Or(Parse.String("last month").Return(DataFilterEntity.LastMonth)
            .Or(Parse.String("none").Return(DataFilterEntity.None))
            .Or(Parse.String("custom").Return(DataFilterEntity.Custom())))))
        select filter;

カスタムラインが問題です。「カスタム」文字列を解析する必要がありますが、次に from および to DateTime フィールドも解析し、それらを DataFilterEntity.Custom(from, to) に渡します。

どんなアイデアでも大歓迎です。

4

1 に答える 1

7

最初に DateTime のパーサーを作成し、次にカスタム タイプのパーサーを作成する必要があります。これは、「おそらく機能する最も単純なもの」の例です。おそらく、DateTimeParser が受け入れる値をもう少し具体的にしたいと思うでしょう。あなたの DataFilterEntity のコンストラクターがどのように見えるかわからないので、推測しました:)

public static readonly Parser<DateTime> DateTimeParser =
    from day in Parse.Number
    from s1 in Parse.Char('/')
    from month in Parse.Number
    from s2 in Parse.Char('/')
    from year in Parse.Number
    select new DateTime(int.Parse(year), int.Parse(month), int.Parse(day));

public static readonly Parser<DataFilterEntity> CustomParser =
    from a1 in Parse.String("custom").Token()
    from fromDateTime in DateTimeParser.Token()
    from toDateTime in DateTimeParser.Token()
    select new DataFilterEntity(fromDateTime.ToShortDateString() + " -> " + toDateTime.ToShortDateString());

public static readonly Parser<DataFilterEntity> TimeFilter =
    Parse.String("today").Return(DataFilterEntity.Today)
        .Or(Parse.String("yesterday").Return(DataFilterEntity.Yesterday)
        .Or(Parse.String("last week").Return(DataFilterEntity.LastWeek)
        .Or(Parse.String("last month").Return(DataFilterEntity.LastMonth)
        .Or(Parse.String("none").Return(DataFilterEntity.None))
        .Or(CustomParser))));

public void TestIt()
{
    var result = TimeFilter.Parse("custom 21/3/2013 10/4/2013");
    Console.Out.WriteLine("result.Value = {0}", result.Value);
}
于 2013-03-05T10:06:30.187 に答える