2014-03-30 133 views
0

我有活動日期的集合,其中包括以下內容:計算日期重疊

class EventDate 
{ 
    DateTime startDate; // the date when the event starts 
    int lengthInHours; // how many hours the event will run for 
} 

當一個新的要添加,我需要檢查,以確保事件不會重疊任何的集合中的現有事件。

什麼是一個優雅的方式來做這個檢查?

+0

持有此類對象的集合應該已實施此驗證。 – sallushan

+0

你可以顯示包含事件日期集合的代碼嗎? –

+1

請參考這個問題。 http://stackoverflow.com/questions/3786821/check-if-a-date-range-is-within-a-date-range –

回答

1

可以使用TimePeriodChainTime 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 
+0

甜。正是我在找的東西。 –

2

試試這個方法:

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));