我有一系列日期,如下所示,
var dateList = new List<DatePrev>
{
new DatePrev{ FromDate=new DateTime(2014,10,1), ToDate=new DateTime(2015,3,1)},
new DatePrev{ FromDate=new DateTime(2013,2,1), ToDate=new DateTime(2013,10,1)},
new DatePrev{ FromDate=new DateTime(2010,2,1), ToDate=new DateTime(2011,10,1)}
};
此列表用作查找列表。 我有一个搜索数据如下,
var newDate = new DatePrev { FromDate = new DateTime(2015, 2, 1), ToDate = new DateTime(2017, 5, 1) };
我想在dateList集合中搜索,以确定提供的newdate是否可以插入dateList并具有适当的日期范围。 由于提供的日期列表的日期早于datelist第一行的todate,因此不应允许插入。
答案 0 :(得分:1)
如果我理解你的问题,你正在寻找的方法是检查两个“日期跨度”是否重叠。
我,我自己,最近遇到了这样的问题,解决方案相当容易。
鉴于两个日期定义为:
Astart
和Aend
Bstart
和Bend
您可以确定它们是否重叠:
!(Aend < Bstart || Astart > Bend)
因此,您可以编写以下代码:
class DatePrev
{
public DateTime FromDate { get; set; }
public DateTime ToDate { get; set; }
public static bool Overlap(DatePrev dateA, DatePrev dateB)
{
return !(dateA.ToDate < dateB.FromDate || dateA.FromDate > dateB.ToDate);
}
}
(...)
var newDate = new DatePrev(); //specify from and to
if (!dateList.Any(d => DatePrev.Overlap(d, newDate)))
dateList.Add(newDate);
该代码假定DatePrev
包含“理智”值 - 即ToDate > FromDate
。此外,您可能需要调整条件,具体取决于您是将来自/结束日期视为包含还是排他(在需要时将< or >
更改为<= or =>
。)
答案 1 :(得分:0)
如果只有在已添加的日期范围与新的日期范围不重叠时才需要将newDate
添加到现有列表中,您可以这样做:
bool slotTaken = dateList.Any(x => (x.FromDate <= newDate.FromDate &&
x.ToDate >= newDate.FromDate) ||
(x.x.FromDate <= newDate.ToDate &&
x.ToDate >= newDate.ToDate);
if (!slotTaken)
{
dateList.Add(newDate);
}
请注意,对于范围结束的情况,比较条件可能会根据您的要求而改变。如果newDate.FromDate
或newDate.ToDate
等于存储的日期,则当前解决方案会拒绝新的时间间隔。这意味着,根据您的示例,new DatePrev { FromDate = new DateTime(2015, 3, 1), ToDate = new DateTime(2017, 5, 1) };
会被拒绝。如果允许相等的日期,您只需删除比较中的=
,但是您需要考虑两个结束日期相等的特殊情况(即已添加日期范围)。