2011-02-24 3 views
0

주어진 DateRange 주어진 기간과 겹치는 시작 및 종료일 목록을 반환해야합니다.오버랩 시작 및 종료 날짜 얻기

가장 좋은 방법은 무엇입니까? 미리 시간을내어 주셔서 감사합니다.

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

내가 clarifing의 희망에서 편집하기로 결정 때문에 나를 도와있는 사람을 돕고있다

을 편집했다. 중첩 대 교차로 혼란스러워합니다. 시나리오는 내가 3 월 11-15 4 월 (11)

내가 05 사이에 휴가를 갈 2월 11일 (20) 3 월 (11) 01에서 내가 필요

간다 체육관에 가입을 예약했던

도움이 될 수 있습니다 내가 헬스 클럽 내가 돌아 가야 결과에 갈 수 없음을 시작하고 내 구독 유효 종료 날짜를 얻는 것은 STARTDATE = 2011년 3월 1일 = 2011년 3월 15일 종료 날짜입니다

myAttempt : 정적 무효 메인() { // 공휴일 var startDate = new DateTime (2011, 02, 5); var endDate = 새 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

+0

죄송합니다. 겹치는 기간의 시작과 날짜 만 있으면됩니다. 비록 잘못된 결과를 얻는 것 같습니다. – user9969

+0

아, 알겠습니다. 내 대답을 편집했습니다. 이제 지정한 범위와 겹치는 예약 기간의 일부를 반환합니다. – jevakallio

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

+0

당신과 비교해서 나는 엄격한 작은 diff와 함께 한 줄을 더 적게 가지고있다. –

2

LINQ의이 작품은 도움이 될 수 있습니다 :

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

은 다음 OverlappedPeriod 클래스에 따라 결과를 변환

1

한 가지 방법은 교차를 계산하기 위해 Rectangle 클래스를 사용하는 것입니다. 따라서 각 날짜 범위에 대해 사각형을 만든 다음 Rectangle.Intersect() 메서드를 사용하면됩니다.

+2

이것은 심각한 직사각형 남용이 될 것이다 :-) – Axarydax

+1

우! 좋은 생각이지만 상당히 복잡합니다. 당신이 샘플 코드를 줄 수 있다면 나는 하나의 upvote를 줄 것이다. –

+0

하하하! 나는 여분의 순간을 얻을 때 몇 가지 코드를 게시 할 것입니다 ..! – Nick

관련 문제