如何使用过去30天的日期填充下拉列表

时间:2016-01-27 19:26:27

标签: c# asp.net datetime out-of-memory

我正在尝试使用过去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。如何更有效地写这个以便不收到此错误?

4 个答案:

答案 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));
    }