現在、次の形式でユーザーにフィードバックを返しています。
"<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」に変更しました)。 -時間)