2011-03-04 72 views
1

我的名字是Timothy Sassone。我正在開發一些C#中的排序軟件,但遇到了一些麻煩。該計劃的最後一部分旨在獲取每週事件的大量列表(存儲爲一週中的某天和開始和結束時間),並將其分類到包含與另一個事件重疊的事件的子列表中(使得沒有人可能參加子列表中的兩個事件)。生成重疊範圍的子陣列

目前,它通過查找列表中的「最長」事件((endTime-startTime)* numDays)並將其與每個與其重疊的課程添加到子列表中來完成此操作。然後找到所有「衝突」(不重疊的事件)並解決它們,同時刪除最少數量的課程。我有這麼多,但是由於需要處理的範圍很多,我最終得到了很多子列表。有沒有更好的方法來分割列表,這樣我的子列表就更少了?

我已經考慮過一種蠻力方法,只是嘗試一切可能性並盡力而爲,但範圍數足夠高(平均在100-500之間),這樣做可能會相當緩慢。任何建議或指針將不勝感激。

謝謝您的時間,

蒂莫西·撒森

+0

我不認爲我得到它。如果event1與event2重疊且event2與event3重疊,它們是否應該全部進入相同的子列表中,即使event1可能不與event3重疊? – Jan 2011-03-06 14:48:05

+0

不可以。我們的目標是讓列表形成,使任何人都無法參加任何給定列表中的兩個事件。如果event1與event2和event3重疊,但event2和event3不重疊,則可以同時參加event2和event3。我將根據這些清單安排其他活動,如果涉及的兩個每週活動也重疊,則新活動的時間只能重疊(從而防止任何人同時參與)。 謝謝你的時間! – 2011-03-06 16:50:20

回答

0

時間段庫.NEThttp://www.codeproject.com/KB/datetime/TimePeriod.aspx包括TimePeriodIntersector搜索重疊的時間段。

通過對時間線上的所有時刻進行計數/排序,使用線性快速算法計算重疊。

而且TimePeriodIntersector的用法是這樣的:

// ---------------------------------------------------------------------- 
public void TimePeriodCombinerSample() 
{ 
    TimePeriodCollection periods = new TimePeriodCollection(); 

    periods.Add(new TimeRange(new DateTime(2011, 3, 01), new DateTime(2011, 3, 10))); 
    periods.Add(new TimeRange(new DateTime(2011, 3, 04), new DateTime(2011, 3, 08))); 

    periods.Add(new TimeRange(new DateTime(2011, 3, 15), new DateTime(2011, 3, 18))); 
    periods.Add(new TimeRange(new DateTime(2011, 3, 18), new DateTime(2011, 3, 22))); 
    periods.Add(new TimeRange(new DateTime(2011, 3, 20), new DateTime(2011, 3, 24))); 

    periods.Add(new TimeRange(new DateTime(2011, 3, 26), new DateTime(2011, 3, 30))); 

    TimePeriodCombiner<TimeRange> periodCombiner = new TimePeriodCombiner<TimeRange>(); 
    ITimePeriodCollection combinedPeriods = periodCombiner.CombinePeriods(periods); 

    foreach (ITimePeriod combinedPeriod in combinedPeriods) 
    { 
    Console.WriteLine("Combined Period: " + combinedPeriod); 
    } 
    // > Combined Period: 01.03.2011 - 10.03.2011 | 9.00:00 
    // > Combined Period: 15.03.2011 - 24.03.2011 | 9.00:00 
    // > Combined Period: 26.03.2011 - 30.03.2011 | 4.00:00 
} // TimePeriodCombinerSample