如何在一个更好的时尚中构造这个字符串?

Phi*_*ace 0 c# string winforms

我有一个具有可配置延迟(Timespan)的工具,我想根据值设置标签的文本.这是我的代码:

    StringBuilder time = new StringBuilder();
    if (Settings.Default.WaitPeriod.Hours > 0)
    {
        time.AppendFormat("{0} hour(s)", Settings.Default.WaitPeriod.Hours);
    }

    if (Settings.Default.WaitPeriod.Minutes > 0)
    {
        time.AppendFormat("{0}{1} minute(s)", time.Length > 0 ? " and " : "", Settings.Default.WaitPeriod.Minutes);
    }

    if (Settings.Default.WaitPeriod.Seconds > 0)
    {
        time.AppendFormat("{0}{1} second(s)", time.Length > 0 ? " and " : "", Settings.Default.WaitPeriod.Seconds);
    }

    this.questionLabel.Text = String.Format("What have you been doing for the past {0}?", time);
Run Code Online (Sandbox Code Playgroud)

我发现"(s)"特别令人恼火 - 但不要想要一百万if/ternary if语句.

因此,忽略非本地化字符串,您能想到更好的方法吗?

scw*_*ner 7

private void AddValue(StringBuilder time, int units, string unitLabel)
{
    if (units > 0)
    {
        if (0 < time.Length)
        {
            time.Append(" and ");
        }
        time.AppendFormat("{0} {1}{2}", units, unitLabel, (1 == units ? String.Empty : "s"));
    }
}

private void YourExistingMethod()
{
    StringBuilder time = new StringBuilder();
    AddValue(time, Settings.Default.WaitPeriod.Hours, "hour");
    AddValue(time, Settings.Default.WaitPeriod.Minutes, "minute");
    AddValue(time, Settings.Default.WaitPeriod.Seconds, "second");
    this.questionLabel.Text = String.Format("What have you been doing for the past {0}?", time);
}
Run Code Online (Sandbox Code Playgroud)