是否有更有效的方法来编写使用DateTime值的IF语句
本文关键字:DateTime 值的 语句 IF 有效 方法 是否 | 更新日期: 2024-09-27 07:29:46
我有一个庞大的if语句列表,这些语句将当前日期与设定的截止日期进行比较,然后显示距离截止日期还有多少天,或者显示是否已经达到截止日期。只是想知道是否有更有效的方法来解决这个问题。
下面是一个"集合"语句的例子,大约还有7个这样的语句。这几乎有点恶心,我在寻找一点帮助或正确的方向来整理它。谢谢
if (DateTime.Now >= programming1)
{
lblReadDate.Text = "Due date for Programming Assignment 1 has been reached (" + programming1.ToShortDateString() + ").";
}
else
{
lblReadDate.Text = "Days remaining until Programming Assignment 1 deadline: " + daysRemaining1.ToString("0");
}
if (DateTime.Now >= programming2)
{
lblReadDate2.Text = "Due date for Programming Assignment 2 has been reached (" + programming2.ToShortDateString() + ").";
}
else
{
lblReadDate2.Text = "Days remaining until Programming Assignment 2 deadline: " + daysRemaining2.ToString("0");
}
很难说哪种方法最适合您,但我推测您通常希望有一个表示作业的类,例如:
public class Assignment
{
public string Name { get; set; }
public DateTime DueDate { get; set; }
// This is just one of many ways to do it.
// This can be an extension method, for example.
// Note also that DateTime.UtcNow is changing as
// you are traversing the list.
public bool IsOverdue
{
get { return DateTime.UtcNow > DueDate; }
}
}
关联两个实体(在本例中为赋值实例和标签)的一般方法是通过Dictionary<TKey, TValue>
。在这种情况下,为了简单起见,您可以通过分配名称进行映射:
// This is just one of many ways to do it.
// You could make Assignment implement IEquatable, or
// specify a custom comparer and map from actual
// Assignment to a Label, for instance.
var assignmentToLabelMap = new Dictionary<string, Label>
{
{ "Programming Assignment 1", label1 },
{ "Programming Assignment 2", label2 },
{ "Programming Assignment 3", label3 }
}
一旦你有了这个,你的UI更新就很简单了:
// Get the assignments
IList<Assignment> assignments = GetTheListOfAssignments();
// Update labels
foreach (var assignment in assignments)
{
// no error checking here whatsoever
var label = assignmentToLabelMap[assignment.Name];
if (assignment.IsOverdue)
label.Text = xxx;
else
label.Text = yyy;
}
由于您似乎在使用WinForms,您可能还想实现INotifyPropertyChanged
并配置控件绑定,以使所有这些都自动发生,但仍需要在某个时间遍历列表以触发更改。
任何时候重复代码,都应该寻找一种方法来概括它,这通常意味着将代码移动到一个方法甚至一个新类中。像这样的东西现在可以用了。我没有使用循环,因为我看到您根据检查的值将文本分配给标签。
lblReadDate.Text = compareDate(programming1, "Programming Assignment 1");
lblReadDate2.Text = compareDate(programming2, "Programming Assignment 2");
// common method
public string compareDate(DateTime dateToCompare, string name) {
if (DateTime.Now >= dateToCompare)
return "Due date for " + name + " has been reached (" + dateToCompare.ToShortDateString() + ").";
return "Days remaining until " + name + " deadline: " + dateToCompare.ToString("0");
}
您还应该考虑使用string.Format
,它可以清理字符串连接(在这种情况下,它对性能没有任何影响,只是让它更容易阅读)。
把程序1、程序2、程序3,。。。转换为DateTime[]?您可以使用for循环并保留计数器,然后只使用计数器。用于分配编号的ToString()。
您可以使用三元运算符来直观地整理它吗?
lblReadDate.Text = DateTime.Now >= programming1 ?
string.format("Due date for Programming Assignment 1 has been reached ({0})", programming1.ToShortDateString()) :
string.format(""Days remaining until Programming Assignment 1 deadline: {0}", daysRemaining1.ToString("0"));
也就是说,一种扩展方法将进一步帮助:
public static class Extensions
{
public static bool CompareDateToNow(this DateTime compareFrom)
{
return DateTime.Now >= compareTo;
}
}
然后变成:
lblReadDate.Text = programming1.CompareDateToNow() ?
string.format("Due date for Programming Assignment 1 has been reached ({0})", programming1.ToShortDateString()) :
string.format(""Days remaining until Programming Assignment 1 deadline: {0}", daysRemaining1.ToString("0"));
您可以进一步合理化语句中的字符串,并最终将日期和程序名称传递到它自己的方法中。
重构这类代码很容易。
你可以把代码放在一个扩展方法中,然后调用它。
例如
lblReadDate.Text = programming1.GetAssignmentMessage("1", daysRemaining1);
lblReadDate2.Text = programming2.GetAssignmentMessage("2", daysRemaining2);
扩展方法:
public static string GetAssignmentMessage(this DateTime programming, string assignment, int daysRemaining)
{
if (DateTime.Now >= programming)
{
return "Due date for Programming Assignment " + assignment + " has been reached (" + programming.ToShortDateString() + ").";
}
else
{
return "Days remaining until Programming Assignment " + assignment + " deadline: " + daysRemaining.ToString("0");
}
}
您的程序应该有下面这样的类。
public class Program
{
public string Id { get; set; }
public string Name { get; set; }
public DateTime DueDate { get; set; }
}
您可以将程序对象传递给类似follow的方法以获得所需的消息。
Public string GetMessage(Program program)
{
if(DateTime.Now > Program.DueDate)
return string.Format("Due date for Programming Assignment {0} has been reached {1}.",Program.Name,Program.DueDate);
else
string.Format("Days remaining until Programming Assignment {0} deadline: {1}",Program.Name,Program.DueDate);
}
如果您需要在程序对象的集合中检查此项。根据需要修改GetMessage方法。
我希望这对你有帮助。快乐编码。:)