Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算日期范围时引发System.OutOfMemoryException_C#_Datetime_Out Of Memory - Fatal编程技术网

C# 计算日期范围时引发System.OutOfMemoryException

C# 计算日期范围时引发System.OutOfMemoryException,c#,datetime,out-of-memory,C#,Datetime,Out Of Memory,这可能是一个简单的解决办法,但我一辈子都想不出如何做到这一点。我使用此查询将一组开始日期和结束日期计算为一组日期数组: this.Reserved = unit.Reservations.Where(r => r.Active.HasValue && r.Active.Value).SelectMany(r => Utilities.DateRangeToArray(r.StartDate, r.EndDate)).ToArray(); Utilities.Date

这可能是一个简单的解决办法,但我一辈子都想不出如何做到这一点。我使用此查询将一组开始日期和结束日期计算为一组日期数组:

this.Reserved = unit.Reservations.Where(r => r.Active.HasValue && r.Active.Value).SelectMany(r => Utilities.DateRangeToArray(r.StartDate, r.EndDate)).ToArray();
Utilities.DateRangeTarray()的定义如下:

public static IEnumerable<DateTime> DateRangeToArray(DateTime start, DateTime end) {
    DateTime curDate = start;
    while (curDate <= end) {
        yield return curDate;
        curDate.AddDays(1);
    }
}
公共静态IEnumerable DateRangeTarray(日期时间开始,日期时间结束){
DateTime curDate=开始;

虽然(curDate您的代码已中断-
AddDays
不会更改现有值,但会返回一个新值。您将忽略该新值,从而创建一个无限循环

将代码更改为:

public static IEnumerable<DateTime> DateRangeToArray(DateTime start,
                                                     DateTime end) {
    DateTime curDate = start;
    while (curDate <= end) {
        yield return curDate;
        curDate = curDate.AddDays(1);
    }
}
公共静态IEnumerable DateRangeTarray(日期时间开始,
日期时间(结束){
DateTime curDate=开始;

虽然(curDate您的代码已中断-
AddDays
不会更改现有值,但会返回一个新值。您将忽略该新值,从而创建一个无限循环

将代码更改为:

public static IEnumerable<DateTime> DateRangeToArray(DateTime start,
                                                     DateTime end) {
    DateTime curDate = start;
    while (curDate <= end) {
        yield return curDate;
        curDate = curDate.AddDays(1);
    }
}
公共静态IEnumerable DateRangeTarray(日期时间开始,
日期时间(结束){
DateTime curDate=开始;

虽然(curDate你肯定在r.StartDate>r.EndDate的地方没有任何保留,对吗?如果你有,我想你会得到一个无限循环。

你肯定在r.StartDate>r.EndDate的地方没有任何保留,对吧?如果你有,我想你会得到一个无限循环。

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

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

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

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

不,这是它不会创建无限循环的唯一情况,因为它根本不会进入
循环的主体。不,这是它不会创建无限循环的唯一情况,因为它根本不会进入
循环的主体。这太容易错过…带来不可变的类/声明的方面-无效果的方法,这可能会产生一个警告,说明该语句没有效果。有趣的是,在我发布它之后,我发现了它。但当然,每个人都已经回答了。还有一个家伙不久前在博客上写了关于泛型范围的文章:。这太容易错过了…带来不可变类/声明的无副作用的方法,w在这里,这可能会产生一个警告,说明该声明无效。有趣的是,在我发布该声明后,我发现了它。但当然,每个人都已经回答了。还有一个家伙不久前在博客上发布了关于通用范围的内容:。