2011-02-24 132 views
0

給定一個DateRange我需要返回與給定時間段重疊的Start和EndDates的列表。獲取重疊的開始日期和結束日期

什麼是最好的辦法呢?感謝您的時間提前。

 static void Main(string[] args) 
      { 
      //Period 1stMarch to 20th April 
      var startDate = new DateTime(2011, 03, 1); 
      var endDate = new DateTime(2011, 4, 20); 

      List<BookedPeriod> bookedPeriods=new List<BookedPeriod>(); 
      bookedPeriods.Add(new BookedPeriod {StartDate = new DateTime(2011, 02, 5), EndDate = new DateTime(2011, 3, 15)}); 
      bookedPeriods.Add(new BookedPeriod { StartDate = new DateTime(2011, 03, 20), EndDate = new DateTime(2011, 4, 10) }); 
      bookedPeriods.Add(new BookedPeriod { StartDate = new DateTime(2011, 04, 01), EndDate = new DateTime(2011, 4, 15) }); 

      List<OverlappedPeriod> myOverllappedPeriods = GetOverllapedPeriods(startDate, endDate, bookedPeriods); 
      } 

      public static List<OverlappedPeriod>GetOverllapedPeriods(DateTime startDate,DateTime endDate,List<BookedPeriod>bookedPeriods) 
      { 
      List<OverlappedPeriod>overlappedPeriods=new List<OverlappedPeriod>(); 

      // Given a DateRange I need to return a list of Start and EndDates that overlaps 
      //??how I do i 


      return overlappedPeriods; 
      } 
     } 

     public class BookedPeriod 
     { 
      public DateTime StartDate { get; set; } 
      public DateTime EndDate { get; set; } 
     } 

     public class OverlappedPeriod 
     { 
      public DateTime StartDate { get; set; } 
      public DateTime EndDate { get; set; } 
     } 

EDITED

我已經決定在clarifing的希望編輯和幫助,因此誰也幫我。 我被重疊vs相交弄糊塗了。 情景可能有助於

我已預訂了認購,從01變爲3月11日至20日年4月11

我去度假的05間年2月3月11日至15日11

我需要去健身房拿到啓動並當我的訂閱是有效的結束日期,我也不會去健身房 結果,我應該得到的回覆是起始日期= 2011年3月1日結束日期= 2011年3月15

myAttempt: 靜態無效的主要() { //節假日期間 var startDate = new DateTime(2011,02,5); var endDate = new DateTime(2011,3,15);

   List<BookedPeriod> bookedPeriods = new List<BookedPeriod>(); 
      bookedPeriods.Add(new BookedPeriod { StartDate = new DateTime(2011, 02, 5), EndDate = new DateTime(2011, 4, 20) }); 

      List<OverlappedPeriod> overlappedPeriods=new List<OverlappedPeriod>(); 

      foreach (var bookedPeriod in bookedPeriods) 
      { 
       DateTime newStartDate = new DateTime(); 
       DateTime newEndDate = new DateTime(); 
       OverlappedPeriod overlappedPeriod=new OverlappedPeriod(); 
       overlappedPeriod.StartDate = newStartDate; 
       overlappedPeriod.EndDate = newEndDate; 

       GetDateRange(bookedPeriod.StartDate, bookedPeriod.EndDate, out newStartDate, out newEndDate); 
       overlappedPeriods.Add(overlappedPeriod); 

      } 
      //do something with it 

      } 
      private static void GetDateRange(DateTime startDate,DateTime endDate,out DateTime newStartDate,out DateTime newEndDate) 
      { 
       /* 
       * I need to get the start and end date when my subscription is valid that I will NOT BE GOING TO THE GYM 
        The result I should get back is StartDate=1 March 2011 EndDate =15 March 2011 

       */ 
      } 

回答

1

您是在尋找完全在規定的時間內,還是僅僅部分的日期?

完全的範圍內:

var overlapped = 
    from period in bookedPeriods 
    where period.StartDate >= startDate && period.EndDate <= endDate 
    select new OverlappedPeriod { StartDate = period.StartDate, EndDate = period.EndDate }; 
overlappedPeriods = overlapped.ToList();  

部分重疊:

var overlapped = 
    from period in bookedPeriods 
    where (period.StartDate >= startDate && period.EndDate <= endDate) 
     || (period.EndDate >= startDate && period.EndDate <= endDate) 
     || (period.StartDate <= startDate && period.EndDate >= startDate) 
     || (period.StartDate <= startDate && period.EndDate >= endDate) 
    select new OverlappedPeriod 
    { 
     StartDate = new DateTime(Math.Max(period.StartDate.Ticks, startDate.Ticks)), 
     EndDate = new DateTime(Math.Min(period.EndDate.Ticks, endDate.Ticks)) 
    }; 

overlappedPeriods = overlapped.ToList();  
+0

非常感謝!!!!我需要得到兩個。我現在會放棄它 – user9969 2011-02-24 12:00:32

+0

對不起。我只需要得到重疊期的開始日期和日期。我似乎得到了錯誤的結果,雖然 – user9969 2011-02-24 12:10:03

+0

啊,我明白了。編輯我的答案。現在返回與指定範圍重疊的已預訂期間的部分。 – jevakallio 2011-02-24 12:20:01

0

像這樣的東西(未測試不好意思):

return bookedPeriods.Where(
    b => (b.StartDate > startDate && b.StartDate < endDate) || 
    (b.EndDate> startDate && b.EndDate < endDate) || 
    (b.StartDate < startDate && b.EndDate > endDate) 
).ToList() 
+0

依我看,你應該已經測試,這錯過了一大堆的案件。 – jevakallio 2011-02-24 11:47:20

+0

與你的相比,我有相同的一行少用嚴格的 – 2011-02-24 11:53:34

2

這塊LINQ的可能幫助:

var overlappedPeriods = bookedPeriods.Where(p=>p.EndDate > startDate && p.StartDate < endDate); 

然後相應地變換的結果,你OverlappedPeriod類

1

一種方法是使用Rectangle類來計算相交。因此,該過程將爲每個日期範圍創建一個矩形,然後使用Rectangle.Intersect()方法。

+2

小差異這將是一個嚴重的矩形濫用:-) – Axarydax 2011-02-24 11:39:23

+1

Oooh!好主意,但相當複雜。如果你能給出一個示例代碼,我會給你一個upvote。 – 2011-02-24 11:40:26

+0

哈哈哈哈!我知道,當我得到一個空閒時刻,我會張貼一些代碼..! – Nick 2011-02-24 11:56:39

相關問題