我正在尝试使用过去30个日期填充下拉列表,我收到错误:
类型' System.OutOfMemoryException'的例外情况发生在mscorlib.dll中但未在用户代码中处理
这是我填写下拉列表的功能:
public void FillDates(int NumDaysBack)
{
for (DateTime d = DateTime.Now.AddDays(-NumDaysBack); d < DateTime.Now; d.AddDays(1))
{
ddMiscDateList.Items.Add(d.ToShortDateString());
}
ddMiscDateList.Items.Add("Other");
}
我在加载时调用此函数并使用30来表示NumDaysBack。如何更有效地写这个以便不收到此错误?
答案 0 :(得分:7)
DateTime.AddDays()返回DateTime的新实例。它不会改变d变量。因此,你有无限的循环。 你可以解决它
public void FillDates(int NumDaysBack)
{
for (DateTime d = DateTime.Now.AddDays(-NumDaysBack); d < DateTime.Now; d = d.AddDays(1))
{
ddMiscDateList.Items.Add(d.ToShortDateString());
}
ddMiscDateList.Items.Add("Other");
}
答案 1 :(得分:2)
public void FillDates(int NumDaysBack)
{
for (DateTime d = DateTime.Now.AddDays(-NumDaysBack); d < DateTime.Now; d = d.AddDays(1))
//----------------------------------------------------------------------^^^^-fixed here
{
ddMiscDateList.Items.Add(d.ToShortDateString());
}
ddMiscDateList.Items.Add("Other");
}
当你调用d.AddDays(1)时,它会返回DateTime的新实例(不更新d)
答案 2 :(得分:0)
调用d.AddDays(1)
您将获得DateTime
的新实例,即您未对DateTime d
对象应用任何更改。因此,你的循环永远不会终止,你最终会耗尽内存。
解决方案是改为编写d = d.AddDays(1)
。
来自MSDN文档:
返回一个新的DateTime,它将指定的天数添加到此实例的值中。
此外,如果您只对实际日期的算术(在您的情况下添加)感兴趣,那么您可能希望省略实际时间部分而是使用:
DateTime.Now.Date
或简化:
DateTime.Today
您仍将拥有时间部分,但会将其设置为00:00:00
DateTime Today Property:
设置为今天日期的对象,时间组件设置为00:00:00。
因为它返回当前日期而没有当前时间,所以Today属性适用于仅使用日期的应用程序。
相反,如果您只想使用当天的时间,请使用DateTime.TimeOfDay
,而不在当天返回DateTime
个对象。
答案 3 :(得分:0)
生成序列时有时Enumerable.Range可能是一个不错的选择。 像。的东西。
public void FillDates(int NumDaysBack)
{
ddMiscDateList.Items = Enumerable.Range(0, NumDaysBack).Select(x => DateTime.Now.AddDays(-NumDaysBack + x));
}