0

現在、次の形式でユーザーにフィードバックを返しています。

"<UserName> removed 07:00, 07:15, 07:30, 07:45, 08:00, 08:15, 08:30, 09:00, 09:15, 09:30, 09:45, 10:00, 10:15, 10:30, 11:15, (etc.)"

...当然のことながら、代わりに次のように、よりユーザーフレンドリーにしたいと考えています。

<UserName> removed 07:00 - 8:30, 9:00 - 10:30, 11:15 - (etc.)

これらの値を StringBuilder に連結するメソッド全体を作り直すのではなく、最初の出力を取得して 2 番目の出力に変換したいと考えています。何かのようなもの:

sbQuarterHoursRemoved = CombineSucceedingQuarterHours(sbQuarterHoursRemoved);

これは私には退屈なように見えますか、それとも比較的簡単に達成できる方法を誰かが知っていますか?

アップデート

以下のコードをこれに適応させました:

String QuarterHoursRemovedPrettified = PrettifyQuarterHoursRemoved(sbQuarterHoursRemoved);
. . .

private static string PrettifyQuarterHoursRemoved(StringBuilder sbQuarterHoursRemoved)
{
    string[] times = sbQuarterHoursRemoved.ToString().Split(',');
    DateTime prevDt = new DateTime(1);
    string prevString = "";

    StringBuilder output = new StringBuilder();
    foreach (string time in times) {
        DateTime dt = DateTime.ParseExact(time, "HH:mm", CultureInfo.InvariantCulture);
        if (dt.Subtract(prevDt).TotalMinutes > 15) {
            if (prevString != "")
                output.Append(" " + prevString + ",");
            output.Append(" " + time + " -");
        }
        prevString = time;
        prevDt = dt;
    }
    output.Remove(output.Length - 1, 1);
    return output.ToString(); 
}

このような時間の値 (Split() の呼び出し後):

00:45
01:00
01:15
22:45
23:00

ループの 2 番目のパスで常にクラッシュします。最初は問題なく動作しますが、2 回目は値に関係なくクラッシュします。たとえば、初回は dt は次のようになります。

dt = 6/26/2012 12:45 am

...ParseExact() の呼び出し後

...しかし、ParseExact() への 2 回目の呼び出し - たとえば、「time」の値として「01:00」を使用すると失敗します。

エラーの詳細は次のとおりです。

*System.FormatException は処理されませんでした Message=String は有効な DateTime として認識されませんでした。ソース = mscorlib StackTrace: System.DateTimeParse.ParseExact (文字列 s、文字列形式、DateTimeFormatInfo dtfi、DateTimeStyles スタイル) で System.DateTime.ParseExact (文字列 s、文字列形式、IFormatProvider プロバイダー) で TitanNextGen_Platypi.PlatypiMainForm.PrettifyQuarterHoursRemoved (StringBuilder sbQuarterHoursRemoved)の...*

再度更新

現在は機能しています-トリムされていない値が問題でした。たとえば、値が「01:15」ではなく「01:15」の場合、すべてのダラスが壊れました (そして、24 を考慮して ParseExact() の呼び出しで「hh:mm」を「HH:mm」に変更しました)。 -時間)

4

2 に答える 2

2

生データではなく文字列を操作しているため、独自の関数を作成する必要があります。つまり、線形時間で実行できます (文字列を一度だけ解析する必要があります)。

手順は次のとおりです。

  1. 文字列をトークン化します (区切り文字としてコンマを使用)
  2. これらのトークンをループし、連続する 15 分間隔ごとに応答変数を増やします。

    7:00, 7:15, 7:30, 7:45, 8:30
    7:00 - 7:30, 7:45, 8:30
    7:00 - 7:45, 8:30
    

プロセスの概要のみ。文字列トークナイザーを調べる必要があります(私はJavaの男ですが、組み込まれていることは知っています)トークンにインデックスを付けて、時間と10分の数字を参照し、使用できるはずですそれに応じて応答する switch ステートメント。

于 2012-06-26T18:42:46.993 に答える
1

文字列を処理しているときに、現在の場所を追跡し、新しいシーケンスを開始する必要があるかどうかを追跡する必要があります。

    string[] times = { "07:00", "07:15", "07:30", "07:45", "08:00", "08:15", "08:30", "09:00", "09:15", "09:30", "09:45", "10:00", "10:15", "10:30", "11:15" };

    private void Form1_Load(object sender, EventArgs e)
    {
        DateTime prevDt = new DateTime(1);
        string prevString = "";

        StringBuilder output = new StringBuilder("UserXyz Deleted ");
        foreach (string time in times)
        {

            DateTime dt = DateTime.ParseExact(time,"hh:mm", CultureInfo.InvariantCulture);
            if (dt.Subtract(prevDt).TotalMinutes > 15)
            {
                if (prevString != "")
                    output.Append(" " + prevString + ",");
                output.Append(" " + time + " -");
            }
            prevString = time;
            prevDt = dt;
        }
        output.Remove(output.Length - 1, 1);
        MessageBox.Show(output.ToString());
    }
于 2012-06-26T19:13:37.890 に答える