我有活動日期的集合,其中包括以下內容:計算日期重疊
class EventDate
{
DateTime startDate; // the date when the event starts
int lengthInHours; // how many hours the event will run for
}
當一個新的要添加,我需要檢查,以確保事件不會重疊任何的集合中的現有事件。
什麼是一個優雅的方式來做這個檢查?
我有活動日期的集合,其中包括以下內容:計算日期重疊
class EventDate
{
DateTime startDate; // the date when the event starts
int lengthInHours; // how many hours the event will run for
}
當一個新的要添加,我需要檢查,以確保事件不會重疊任何的集合中的現有事件。
什麼是一個優雅的方式來做這個檢查?
可以使用TimePeriodChain類Time Period Library for .NET的。該集合可確保鏈接時間段:
// ----------------------------------------------------------------------
public void TimePeriodChainSample()
{
TimePeriodChain timePeriods = new TimePeriodChain();
DateTime now = ClockProxy.Clock.Now;
DateTime testDay = new DateTime(2010, 7, 23);
// --- add ---
timePeriods.Add(new TimeBlock(
TimeTrim.Hour(testDay, 8), Duration.Hours(2)));
timePeriods.Add(new TimeBlock(now, Duration.Hours(1, 30)));
timePeriods.Add(new TimeBlock(now, Duration.Hour));
Console.WriteLine("TimePeriodChain.Add(): " + timePeriods);
// > TimePeriodChain.Add(): Count = 3; 23.07.2010 08:00:00 - 12:30:00 | 0.04:30
foreach (ITimePeriod timePeriod in timePeriods)
{
Console.WriteLine("Item: " + timePeriod);
}
// > Item: 23.07.2010 08:00:00 - 10:00:00 | 02:00:00
// > Item: 23.07.2010 10:00:00 - 11:30:00 | 01:30:00
// > Item: 23.07.2010 11:30:00 - 12:30:00 | 01:00:00
// --- insert ---
timePeriods.Insert(2, new TimeBlock(now, Duration.Minutes(45)));
Console.WriteLine("TimePeriodChain.Insert(): " + timePeriods);
// > TimePeriodChain.Insert(): Count = 4; 23.07.2010 08:00:00 - 13:15:00 | 0.05:15
foreach (ITimePeriod timePeriod in timePeriods)
{
Console.WriteLine("Item: " + timePeriod);
}
// > Item: 23.07.2010 08:00:00 - 10:00:00 | 02:00:00
// > Item: 23.07.2010 10:00:00 - 11:30:00 | 01:30:00
// > Item: 23.07.2010 11:30:00 - 12:15:00 | 00:45:00
// > Item: 23.07.2010 12:15:00 - 13:15:00 | 01:00:00
} // TimePeriodChainSample
甜。正是我在找的東西。 –
試試這個方法:
class EventDate
{
DateTime startDate; // the date when the event starts
int lengthInHours; // how many hours the event will run for
public bool Overlaps(EventDate otherDate)
{
double hours = (otherDate.startDate - startDate).TotalHours;
return (hours >= 0 && hours <= lengthInHours) ||
(hours < 0 && -hours <= otherDate.lengthInHours);
}
}
用途收集:
bool isOverlapped = collection.Any(date => date.Overlaps(newDate));
持有此類對象的集合應該已實施此驗證。 – sallushan
你可以顯示包含事件日期集合的代碼嗎? –
請參考這個問題。 http://stackoverflow.com/questions/3786821/check-if-a-date-range-is-within-a-date-range –