【问题标题】:How do I populate a dropdown list with the past 30 days of dates如何使用过去 30 天的日期填充下拉列表
【发布时间】:2016-01-27 19:26:26
【问题描述】:

我正在尝试使用过去 30 个日期填充下拉列表,但收到错误消息:

在 mscorlib.dll 中出现“System.OutOfMemoryException”类型的异常,但未在用户代码中处理

这是我填写下拉列表的功能:

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.Today,而不是使用DateTime.Now,它会删除日期的时间部分。和DateTime.Now.Date一样

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


【解决方案1】:

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");
}

【讨论】:

    【解决方案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)

    【讨论】:

      【解决方案3】:

      调用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 对象。

      【讨论】:

        【解决方案4】:

        在生成序列时,有时 Enumerable.Range 可能是一个不错的选择。 类似的东西。

            public void FillDates(int NumDaysBack)
            {
                ddMiscDateList.Items = Enumerable.Range(0, NumDaysBack).Select(x => DateTime.Now.AddDays(-NumDaysBack + x));
            }
        

        【讨论】:

        • 我试过这个,因为它看起来更快,但是,它只是给了我一个错误消息。不过,循环对我来说效果很好。
        • 速度并不快。它做同样的事情。
        • 也许最后一个 .ToList () 可以解决错误。我应该添加的。
        猜你喜欢
        • 1970-01-01
        • 2019-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多