【发布时间】:2018-07-06 07:31:19
【问题描述】:
Class TimeRange{
private DateTime StartDate{get; set;}
private DateTime EndDate{get; set;}
}
List<TimeRange> TimeRangeList = new List<TimeRange>(){
new TimeRange(){StartDate = new DateTime(2050, 1, 1),
EndDate = new DateTime(2050, 1, 10)},
new TimeRange(){StartDate = new DateTime(2050, 2, 1),
EndDate = new DateTime(2050, 2, 10)},
//This item will triggered the overlap validation failed
new TimeRange(){StartDate = new DateTime(2050, 1, 5),
EndDate = new DateTime(2050, 1, 9)},
},
}
所以在我检查了similar topic 之后,我仍然无法弄清楚检查重叠日期范围的算法。
这在SQL中是相当简单的,根据Checking for date overlap across multiple date range objects
我只需要像这样比较两个日期范围
SELECT COUNT(*)
FROM Table1
WHERE Table1.StartDate < 'endCheckDate'
AND Table1.EndDate > 'startCheckDate'
我发现在Linq中很难做到,我们如何比较一个集合中的所有项目?因为我们可以像比较两个列表一样在循环集合中使用 foreach,但是它在 select 中是如何工作的?
其实我正在做这样的事情
for (int i = 0; i < TimeRangeList .Count(); ++i)
{
var item = TimeRangeList[i];
for (int y = i + 1; y < TimeRangeList.Count(); ++y)
{
var item2 = TimeRangeList[y];
if (IsOverLapped(item, item2))
{
// this is overlapped
};
}
}
private bool IsOverLapped(dynamic firstObj, dynamic secondObj)
{
return secondObj.StartDate <= firstObj.EndDate && firstObj.StartDate <= secondObj.EndDate;
}
没有循环有没有更优雅的方法?
所以我的问题是我们如何通过 linq 比较每个项目本身的单个列表?
【问题讨论】:
-
SQL 检查固定的开始/结束时间段。不清楚你想在 Linq 中做什么,对项目进行分组?
-
既然已经提供了示例列表,为什么不提供编译代码?例如,没有接受字符串的 DateTime 构造函数。
-
你可以使用这个 TimePeriod 库:codeproject.com/Articles/168662/Time-Period-Library-for-NET 它还有一个 TimeRange 类和 OverlapsWith 或 IntersectsWith 等方法。
-
@bommelding 很抱歉造成混淆,如果发生重叠,我实际上是在做 ModelState.AddModelError() 。在这种情况下,它只是返回一个布尔值。我更新了我的示例列表,假设必须有一个固定的检查时间,只是我应该确定它在 linq 中是如何工作的
-
@bommelding TimeRangeList.Any( /* 日期时间重叠检查*/ );我将其放入 validation 的规则中