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 的整个方法,而是将第一个输出转换为第二个输出;就像是:

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”作为“时间”中的值失败。

一些错误细节是:

*System.FormatException 未处理 Message=String 未被识别为有效的 DateTime。Source=mscorlib StackTrace:在 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)在...*

再次更新

它现在有效 - 未修剪的 val 是问题所在。例如,当值是“01:15”而不是“01:15”时,所有达拉斯都松散了(我在调用 ParseExact() 时将“hh:mm”更改为“HH:mm”以占 24 -小时时间)

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 人,但我知道有一个内置的)您应该能够索引标记以引用小时和几十分钟的数字并使用一个 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 回答