我做了一个小的解析器,它将通过一条消息并用某个用户替换$ user等等。
除了基本关键字,我希望它替换这样的日期: $ datemo10,今天的日期加上10个月 $ datedd03,今天的日期加上3天 $ datehh07,今天的日期加上7个小时 $ datemm12,今天的日期加上12分钟 $ datess15,今日日期加15秒
这就是我的工作......
const string Identifier = "$";
const string TimeFormat = "HH:mm:ss dd-MM-yyyy";
public static string Encode(string Author, string Recipent, string input)
{
Dictionary<string, string> keywords = new Dictionary<string, string>();
keywords.Add("bye", "With kind regards " + identify("me"));
keywords.Add("user", Recipent);
keywords.Add("me", Author);
keywords.Add("now", DateTime.Now.ToString(TimeFormat));
keywords.Add("date", "");
string result = input;
foreach (KeyValuePair<string, string> keyword in keywords)
{
if (keyword.Key.ToLower() == "date")
{
int addedLength = 0;
foreach (Match match in Regex.Matches(input, "\\" + identify(keyword.Key)))
{
string mode = input.Substring(match.Index + addedLength + match.Length, 2);
string stringInteger = input.Substring(match.Index + addedLength + match.Length + 2, 2);
int integer;
if (int.TryParse(stringInteger, out integer) && !mode.Contains(" "))
{
if (mode == "ss")
{
string dateTime = DateTime.Now.AddSeconds(Convert.ToDouble(integer)).ToString(TimeFormat);
input = input.Remove(match.Index + addedLength, match.Length + 4);
input = input.Insert(match.Index + addedLength, dateTime);
addedLength += (dateTime.Length - (match.Length + 4));
}
else if (mode == "mm")
{
string dateTime = DateTime.Now.AddMinutes(Convert.ToDouble(integer)).ToString(TimeFormat);
input = input.Remove(match.Index + addedLength, match.Length + 4);
input = input.Insert(match.Index + addedLength, dateTime);
addedLength += (dateTime.Length - (match.Length + 4));
}
else if (mode == "hh")
{
string dateTime = DateTime.Now.AddHours(Convert.ToDouble(integer)).ToString(TimeFormat);
input = input.Remove(match.Index + addedLength, match.Length + 4);
input = input.Insert(match.Index + addedLength, dateTime);
addedLength += (dateTime.Length - (match.Length + 4));
}
else if (mode == "dd")
{
string dateTime = DateTime.Now.AddDays(Convert.ToDouble(integer)).ToString(TimeFormat);
input = input.Remove(match.Index + addedLength, match.Length + 4);
input = input.Insert(match.Index + addedLength, dateTime);
addedLength += (dateTime.Length - (match.Length + 4));
}
else if (mode == "mo")
{
string dateTime = DateTime.Now.AddMonths(integer).ToString(TimeFormat);
input = input.Remove(match.Index + addedLength, match.Length + 4);
input = input.Insert(match.Index + addedLength, dateTime);
addedLength += (dateTime.Length - (match.Length + 4));
}
else if (mode == "yy")
{
string dateTime = DateTime.Now.AddYears(integer).ToString(TimeFormat);
input = input.Remove(match.Index + addedLength, match.Length + 4);
input = input.Insert(match.Index + addedLength, dateTime);
addedLength += (dateTime.Length - (match.Length + 4));
}
}
}
}
else
{
input = Regex.Replace(input, "\\" + identify(keyword.Key), keyword.Value);
}
}
return input;
}
protected static string identify(string val)
{
return Identifier + val;
}
我觉得保留需要在字典中替换的关键字很好,但我真的不喜欢我解析和替换日期的方式。
但是作为整个编程世界的新手,这是我能够使其发挥作用的唯一方式。虽然我完全能够理解为什么它会变得更好,如果你对如何让它以一种不那么黑的方式工作有任何想法,请告诉我:)
撕裂它,但请在建设性的事情中这样做。 我怎样才能让它变得更好?
我知道有相当多的重复代码..嘘
谢谢:)
答案 0 :(得分:0)
我建议查看http://msdn.microsoft.com/en-us/library/system.timespan.aspx 以及其他msdn库,了解有关您要执行的操作的更多信息。他们有很好的例子和所有.net库的所有信息。
对于初学者来说,你应该把重复的代码放到它自己的函数中,这样你就不会重复了,如果我在编程时多次触摸ctrl + c键,我发现我做错了。
另外,您是刚刚获得当前日期并为每小时minuet ext ext添加时间。如果你在每个日期添加一些时间,我认为你可以更容易地做到这一点
我认为c#有一个通用的datetime.add函数可以用来添加 一个时间跨度。时间跨度由所有$ datedd03 $ datehh07部分组成。我还在学习c#所以我对c#不太好,所以对datetime更有经验的人应该能够帮助更多
顶部的链接包含有关时间跨度功能的信息。