2017-01-20 19 views
1

"이벤트"개체의 목록이 있습니다.다른 날짜의 두 DateTime 개체 사이의 시간 검색

모든 이벤트에서 "EventStartTime"및 "EventEndTime"이 DateTime 개체로 선언되었습니다.

는 내가 예를 10시를 들어, 시간에 "이벤트"를 검색 할 수있는

는 "사건"은 아래 참조 보여줍니다 이 2 월 17 일, 및 끝에 22:00의 축제 시작 다음 날 15시에. 나는 이것들을 더 좋아한다.

new EventsManager.Event() //3 
{ 
    EventType = EventsManager.EventType.Festival, 
    EventName = "Twistival", 
    EventPlace = placeList[4], 
    EventStartTime =new DateTime(2017,02,17,22,0,0), 
    EventEndTime = new DateTime(2017,02,18,15,0,0), 
    EventNumberOfParticipants = 8000 
}, 

내가 이벤트를 검색 할 때 그래서 발생하는, 또는 정지 10시 난이 이벤트를 받아야에서에서 발생.

제안 사항?

+0

그래서 그냥 이벤트가있는 날 (10)을 다루고 있는지 알고 싶어 출력? 즉, 확인해야 할 특정 'DateTime'이 없습니까? – juharr

+1

참고 사항 : 개체의 이름을 다른 것으로 지정하십시오. 이것을 WinForms 앱에 넣으면 "이벤트"가 빨리 혼란 스러울 것입니다. 개체 이름으로 키워드를 사용하지 않도록하십시오. 내가 코드를 호출하기 전에, 키워드가 객체 이름으로 사용되었다는 것을 발견하면 항상 동의어 사전을 먼저 읽습니다.이 경우는 "활동"이 더 나은 방법 일 수 있습니다. – CDove

+0

@ user1895086 좋은 조언 주셔서 감사합니다. –

답변

0

당신이 판단 할 일의 특정 시간을 가정하면 이벤트 커버하는 경우 그것과 관련된 날짜에 관계없이 고려해야 할 4 가지 경우가 있습니다. 첫째로 날짜가 1 일 이상 떨어져 있다면 그들은 하루 중 모든 시간을 다룹니다. 시작 시간이 시간보다 길고 끝 시간이 시간보다 길면 시간이 포함됩니다. 마지막 두 가지 경우는 종료 날짜가 시작 날짜의 다음날이어야하고 시작 날짜가 시간보다 길거나 종료 날짜가 시간보다 늦은 시간이어야합니다. 시작 날짜가 종료 날짜 이전임을 가정합니다.

var events = new List<Tuple<DateTime, DateTime>> 
{ 
    // start and end after time of day but on different days 
    Tuple.Create(
     new DateTime(2017, 02, 17, 22, 0, 0), 
     new DateTime(2017, 02, 18, 15, 0, 0)), 
    // start and end before time of day but on different days 
    Tuple.Create(
     new DateTime(2017, 02, 17, 9, 0, 0), 
     new DateTime(2017, 02, 18, 7, 0, 0)), 
    // start before and end after same day 
    Tuple.Create(
     new DateTime(2017, 02, 17, 9, 0, 0), 
     new DateTime(2017, 02, 17, 11, 0, 0)), 
    // covers more than 1 day 
    Tuple.Create(
     new DateTime(2017, 02, 17, 22, 0, 0), 
     new DateTime(2017, 02, 18, 22, 0, 1)), 
    // start after and end before on different days 
    Tuple.Create(
     new DateTime(2017, 02, 17, 22, 0, 0), 
     new DateTime(2017, 02, 18, 10, 0, 0)), 
    // start and end before on same day 
    Tuple.Create(
     new DateTime(2017, 02, 17, 7, 0, 0), 
     new DateTime(2017, 02, 17, 8, 0, 0)), 
    // start and end after on same day 
    Tuple.Create(
     new DateTime(2017, 02, 17, 11, 0, 0), 
     new DateTime(2017, 02, 17, 12, 0, 0)), 
}; 

var timeOfDay = new TimeSpan(0, 10, 0 ,0); 

foreach (var x in events) 
{ 
    if (x.Item2 - x.Item1 > TimeSpan.FromDays(1) 
     || (x.Item1.TimeOfDay < timeOfDay && x.Item2.TimeOfDay > timeOfDay) 
     || (x.Item1.Date < x.Item2.Date 
      && (x.Item1.TimeOfDay < timeOfDay || x.Item2.TimeOfDay > timeOfDay))) 
    { 
     Console.WriteLine(x); 
    } 

} 

(2/17/2017 10:00:00 PM, 2/18/2017 3:00:00 PM) 
(2/17/2017 9:00:00 AM, 2/18/2017 7:00:00 AM) 
(2/17/2017 9:00:00 AM, 2/17/2017 11:00:00 AM) 
(2/17/2017 10:00:00 PM, 2/18/2017 10:00:01 PM) 
+0

당신은 사람 가운데 신입니다. 그것은 완벽하게 작동합니다! –

1

의 당신이 당신의 Event s의

List<Event> Events; 

있다고 가정 해 봅시다. 당신은 당신의 파일에

using System.Linq; 

을 추가하는 것을 잊지

private IEnumerable<Event> GetRunningEvents(DateTime time) 
{ 
    return Events.Where(E => E.EventStartTime <= time && E.EventEndTime >= time); 
} 

망가 같은 간단한 방법으로 특별한 시간에 실행중인 모든 이벤트를 얻기 위해 간단한 LINQ 쿼리를 생성 할 수 있습니다.

편집 : LINQ없이는 가능한 접근 방법은

private List<Event> GetRunningEvents(DateTime time) 
{ 
    List<Event> RunningEvents = new List<Event>(); 
    foreach(Event E in Events) 
    { 
     if (E.EventStartTime <= time && E.EventEndTime >= time) 
     { 
      RunningEvents.Add(E); 
     } 
    } 
    return RunningEvents; 
} 
+0

저를 때려 눕히십시오, 나의 해결책은 거의 동일하게 보였다. 그리고 나는 상쾌하게했다. 그리고 이것은 롤이었다. – CDove

+0

OP에 특정 'DateTime'이 있는지 확신 할 수 없습니다. 이벤트가 하루에 10 번 발생하는지 확인하고 싶습니다. – juharr

+0

@juharr 예, 구체적인 것은 없습니다. 예를 들어 10시를 사용했습니다. –

0

시도 Linq에 있습니다 :

var list = new List<Event>(); 
var searchTime = DateTime.Now; 
var result = list.Where(e => e.EventStartTime <= searchTime && searchTime <= e.EventEndTime).ToList();