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之后,仍然找不到弄清楚重叠日期范围的算法。
根据Checking for date overlap across multiple date range objects
,这在SQL中非常简单我只需要比较两个日期范围
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比较每个项目本身的一个列表?
答案 0 :(得分:2)
一个简单的蛮力想法:
bool overlap = TimeRangeList
.Any(r => TimeRangeList
.Where(q => q != r)
.Any(q => q.EndDate >= r.StartDate && q.StartDate <= r.EndDate) );
答案 1 :(得分:0)
如果我看一下您的SQLcode,看来您有一个Table1
对象,它是一系列相似的对象,比方说Table1Row
类。每个Table1Row
至少具有两个DateTime属性,一个StartDate
和一个EndDate
。此外,您有两个DateTime对象:startCheckDate
和endCheckDate
。
您要计算Table1
中小于StartDate
的{{1}}和大于startCheckDate
的{{1}}的所有元素
写为IQueryable的扩展功能:
EndDate
用法:
endCheckDate
简单的漫画吧?