根据数字

时间:2016-01-15 14:17:18

标签: c#

我正在开发一个TimeDomains项目。在这个项目中,必须将TimeDomain转换为书面文本 例如,以下TimeDomain作为字符串传递:[[(t2){d5}]*[(h16){h2}]]

  • t是t1为星期日的星期几
  • d是那天之后的天数,包括那天,所以(t2){d5}会显示为“星期一到星期五”(星期五是星期一之后的第5天,包括星期一)

这里的问题是我无法想出一种方法来确定d值代表哪一天基于t值。如果d是固定值,那将很容易,但d可以是1到7之间的任何值。

我有以下代码:

string dayFromName;
StringBuilder stringBuilder = new StringBuilder();

foreach (string s in TimeDomain)
{              
    var indexOfFirstBraceDayFrom = s.IndexOf('t') + 1;
    var indexOfLastBraceDayFrom = s.IndexOf(')');
    var dayFromTemp = s.Substring(indexOfFirstBraceDayFrom, indexOfLastBraceDayFrom - indexOfFirstBraceDayFrom).Split(' ');
    var dayFrom = dayFromTemp[0];

    var indexOfFirstBraceDayTo = s.IndexOf('d') + 1;
    var indexOfLastBraceDayTo = s.IndexOf('}');
    var dayToTemp = s.Substring(indexOfFirstBraceDayTo, indexOfLastBraceDayTo - indexOfFirstBraceDayTo).Split(' ');
    var dayTo = dayToTemp[0];

    if (dayFrom == "1")
        dayFromName = "Sunday";
    if (dayFrom == "2")
        dayFromName = "Monday";
    if (dayFrom == "3")
        dayFromName = "Tuesday";
    if (dayFrom == "4")
        dayFromName = "Wednesday";
    if (dayFrom == "5")
        dayFromName = "Thursday";
    if (dayFrom == "6")
        dayFromName = "Friday";
    if (dayFrom == "7")
        dayFromName = "Saturday";

    stringBuilder.Append(dayFromName + "to");
}

但是我不确定如何根据参考T的D值定义“to”之后的日期。你有什么建议吗?

4 个答案:

答案 0 :(得分:3)

我没有看到问题。

一旦你从d值中计算了一天,就可以计算出“到”日的那一天。如果你添加“d”值(考虑包容性,然后对结果进行modulo算术,你可以获得日期数字:

int toDay = (tValue + dValue - 1) % 7;

然后执行与if日相同的if / switch语句(重构代码!)。

你需要将你的“t”和“d”值解析为整数,但是如果你把它作为一个整数,你就可以通过DayOfWeek enumeration转换为日期名称 - 尽管你是'我们必须将您的号码抵消到Microsoft预期的值。

答案 1 :(得分:3)

不是构建if-1-if-2-if-3" if-tree"而是创建查找字典:

var daylookup = new Dictionary<int, string>();
daylookup[1] = "Sunday";
daylookup[2] = "Monday";
...
daylookup[7] = "Saturday";

现在,您可以简单地询问字典:

,而不是编写大量的IF
dayName = daylookup[ dayNumber ];

这还有额外的奖励。由于日期数字只是一个整数,您可以添加,减去等,并且不会发生任何变化:

dayName = daylookup[ dayNumber + 1 ]; // the NEXT day
//or 
dayName = daylookup[ dayNumber + 2 ]; // the DAY AFTER NEXT
//or 
dayName = daylookup[ dayNumber + N ]; // the Nth day forward

这是基本想法。

然而,字典和数学并不那么简单。除非你输入更多,你的词典只有1,2,3,4,5,6,7的条目,并试图读取一个条目,即10(第6 + 2)将抛出异常:没有条目为&# 34; 10&#34;

这很容易解决:

  • 通过向词典添加更多条目
  • 或检查Day + Offset是否超过7并减去7/14/21 /.../ li>
  • 或使用modulo %(不是Day + Offset,但是(Day + Offset)%7)

答案 2 :(得分:1)

您可以使用System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames,唯一的区别是索引从0开始。假设您当前的文化是英语,则以下查询将返回星期日:

Console.WriteLine(CultureInfo.CurrentCulture.DateTimeFormat.DayNames[0])

所以你可以这样做:

int dayNumber = int.Parse(dayFrom) - 1;
dayFromName  = CultureInfo.CurrentCulture.DateTimeFormat.DayNames[dayNumber];

甚至更短,文化独立,正如@cFrozenDeath指出的那样:

var dayFromName2 = (System.DayOfWeek)dayNumber;

答案 3 :(得分:0)

重复使用您的代码,它将如下所示:

string dayFromName;
StringBuilder stringBuilder = new StringBuilder();

foreach (string s in TimeDomain)
      { 
        var dayTomName = string.Empty;
        var dayFromName = string.Empty;

        var indexOfFirstBraceDayFrom = s.IndexOf('t') + 1;
        var indexOfLastBraceDayFrom = s.IndexOf(')');
        var dayFromTemp = s.Substring(indexOfFirstBraceDayFrom, indexOfLastBraceDayFrom - indexOfFirstBraceDayFrom).Split(' ');
        var dayFrom = dayFromTemp[0];

        var indexOfFirstBraceDayTo = s.IndexOf('d') + 1;
        var indexOfLastBraceDayTo = s.IndexOf('}');
        var dayToTemp = s.Substring(indexOfFirstBraceDayTo, indexOfLastBraceDayTo - indexOfFirstBraceDayTo).Split(' ');
        var dayTo = dayToTemp[0];

        dayToName = ((System.DayOfWeek)((int.Parse(dayFrom) + int.Parse(dayTo) - 2) % 7)).ToString();
        dayFromName = ((System.DayOfWeek)(int.Parse(dayFrom) - 1)).ToString();
}