计算日期范围时抛出System.OutOfMemoryException

时间:2010-09-22 08:50:10

标签: c# datetime out-of-memory

这可能是一个简单的修复,但我不能为我的生活想到如何做到这一点。我使用这个查询计算了一堆StartDates和End Dates到一堆日期数组中:

this.Reserved = unit.Reservations.Where(r => r.Active.HasValue && r.Active.Value).SelectMany(r => Utilities.DateRangeToArray(r.StartDate, r.EndDate)).ToArray();

Utilities.DateRangeToArray()定义如下:

public static IEnumerable<DateTime> DateRangeToArray(DateTime start, DateTime end) {
    DateTime curDate = start;
    while (curDate <= end) {
        yield return curDate;
        curDate.AddDays(1);
    }
}

有没有办法减少内存消耗?

谢谢!

3 个答案:

答案 0 :(得分:7)

您的代码已损坏 - AddDays不会更改现有值,而是返回新值。你忽略了这个新值,从而创造了一个无限循环。

将您的代码更改为:

public static IEnumerable<DateTime> DateRangeToArray(DateTime start,
                                                     DateTime end) {
    DateTime curDate = start;
    while (curDate <= end) {
        yield return curDate;
        curDate = curDate.AddDays(1);
    }
}

另一个提示:在您尝试在LINQ查询中使用该方法之前,单元测试可以帮助您找到此类问题。我也会更改名称,因为它没有返回数组。

答案 1 :(得分:0)

你确定你没有任何保留r.StartDate&gt; r.EndDate,对吗?如果你这样做,我认为你会得到一个无限循环。

答案 2 :(得分:0)

我假设在将结果转换为数组时内存不足。两点:

  • 输出将包含重复预订的重复日期。
  • 也许保留应该是日期范围(开始,结束)的集合,而不是包含每个日期?