我正在开发一个TimeDomains项目。在这个项目中,必须将TimeDomain转换为书面文本
例如,以下TimeDomain作为字符串传递:[[(t2){d5}]*[(h16){h2}]]
这里的问题是我无法想出一种方法来确定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”之后的日期。你有什么建议吗?
答案 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";
现在,您可以简单地询问字典:
,而不是编写大量的IFdayName = 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,但是(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();
}