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在这里,这可能会产生一个警告,说明该声明无效。有趣的是,在我发布该声明后,我发现了它。但当然,每个人都已经回答了。还有一个家伙不久前在博客上发布了关于通用范围的内容:。