如何使用过去 30 天的日期填充下拉列表
本文关键字:日期 填充 下拉列表 何使用 过去 | 更新日期: 2023-09-27 18:32:07
我正在尝试使用过去 30 个日期填充下拉列表,但收到错误:
mscorlib 中发生了类型为"System.OutOfMemoryException"的异常.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。 如何更有效地编写此内容以不收到此错误?
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");
}
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)
调用d.AddDays(1)
,您将获得DateTime
的新实例,即您没有对DateTime d
对象应用任何更改。因此,您的循环永远不会终止,并且您最终会耗尽内存。
解决方案是改为编写d = d.AddDays(1)
。
从 MSDN 文档:
返回一个新的 DateTime,该时间将指定的天数添加到此实例的值中。
此外,如果您只对实际日期的算术(在您的例子中添加)感兴趣,那么您可能希望省略实际时间部分,而是使用:
DateTime.Now.Date
或简化:
DateTime.Today
您仍将拥有时间部分,但它将设置为
00:00:00日期时间今日属性:
设置为当前日期的对象,时间组件设置为
00:00:00。由于 Today 属性返回的当前日期不包含当前时间,因此适用于仅使用日期的应用程序。
相反,如果您只想使用一天中的时间,请使用 DateTime.TimeOfDay
返回一个没有当前日期的DateTime
对象。
有时生成序列时,Enumerable.Range 可能是一个不错的选择。类似的东西。
public void FillDates(int NumDaysBack)
{
ddMiscDateList.Items = Enumerable.Range(0, NumDaysBack).Select(x => DateTime.Now.AddDays(-NumDaysBack + x));
}