目前,我以以下形式向用户返回反馈:
"<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 的整个方法,我想将第一个输出转换为第二个输出;如下所示:
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
它总是使通过循环的第二次传递崩溃。第一次进展顺利,但第二次,无论价值如何,都会崩溃。例如,第一次通过,dt 变为:
dt = 6/26/2012 12:45 am
。在调用 ParseExact() 之后
。但是对 ParseExact() 的第二次调用 - 例如,"01:00"作为"time"中的值失败。
一些错误详细信息是:
*System.FormatException 未处理 消息 = 字符串未被识别为有效的日期时间。 来源=mscorlib 堆栈跟踪: at System.DateTimeParse.ParseExact(String s, String format, DateTimeFormatInfo dtfi, DateTimeStyles style) at System.DateTime.ParseExact(String s, String format, IFormatProvider provider) at TitanNextGen_Platypi.PlatypiMainForm.PrettifyQuarterHoursRemoved(StringBuilder sbQuarterHoursRemoved) in...*
再次更新
它现在可以工作了 - 未修剪的瓦尔是问题所在。例如,当值是"01:15"而不是"01:15"时,所有达拉斯都松动了(我在调用 ParseExact() 时将"hh:mm"更改为"HH:mm"以说明 24 小时时间)
好吧,您将需要编写自己的函数,因为您正在操作字符串,而不是原始数据。也就是说,您将能够在线性时间内完成此操作(您只需解析一次字符串)。
步骤包括:
- 标记字符串(使用逗号作为分隔符)
-
循环遍历这些令牌,每连续 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 人,但我知道有一个内置的)您应该能够索引到标记中以引用小时和数十分钟数字,并使用 switch 语句做出相应的响应。
在处理字符串时,您需要跟踪您所在的位置以及是否需要开始一个新序列:
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());
}