System.OutOfMemoryException, возникающее при вычислении диапазонов дат - PullRequest
1 голос
/ 22 сентября 2010

Это может быть простым исправлением, но я не могу думать о том, как это сделать.Я вычисляю кучу 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 ]

7 голосов
/ 22 сентября 2010

Ваш код не работает - AddDays не меняет существующее значение, оно возвращает новое значение. Вы игнорируете это новое значение, создавая бесконечный цикл.

Измените свой код на:

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

Еще один совет: модульное тестирование может помочь вам найти такую ​​проблему задолго до того, как вы попытаетесь использовать метод в запросе LINQ. Я также изменил бы имя, учитывая, что он не возвращает массив.

0 голосов
/ 22 сентября 2010

Я предполагаю, что недостаточно памяти при преобразовании результата в массив.Две точки:

  • Выходные данные будут содержать повторяющиеся даты для перекрывающихся резервирований.
  • Возможно, зарезервировано должно быть набором диапазонов дат (начало, конец), а не содержать каждую дату?
0 голосов
/ 22 сентября 2010

Вы уверены, что у вас нет резервирований, где r.StartDate> r.EndDate, верно? Если вы это сделаете, вы получите бесконечный цикл, я думаю.

...