2016-12-08 3 views
-2

Я бы хотел найти отсутствующие таймеры в списке. Событие имеет StartDate и EndDate (со временем). У меня будет тот же день/месяц/год в этом списке, так что в каждом объекте будет только время. Допустим, что каждое событие на 01-01-2016 то время выглядит следующим образом:Найдите отсутствующие часы и минуты в списке

  • Начало: 07:00 Окончание: 9:00
  • Начало: 9:00 Окончание: 11:30
  • Начало: 13:00 Окончание: 14:00
  • Начало: 18:15 Окончание: 20:00

Я хотел бы найти свободные часы в этом списке, так что я хотел бы получить что-то вроде этого

  • Начало: 11:30 Окончание: 13:00
  • Начало: 14:00 Окончание: 18:15

Как я могу получить что-то подобное?

+0

выглядит довольно прямо вперед для меня .. если список должен течь жгутов 2 часа дифференциал, то если вы нашли значение, которое имеет 1 час разницы, то вы должны знать, что не хватает .. начать писать код и шоу нас, по крайней мере, то, что вы пробовали сами по себе .. также читайте в свойстве 'Hour' в DateTime Struct .. выполните поиск по Google также на TimeSpan, а также удачи – MethodMan

+0

Как насчет' 00:00 -> 07: 00' и ​​'20:00 -> 24: 00'? – TheLethalCoder

+0

@ TheLethalCoder Мне не нужно искать эти часы, потому что событие может начаться в 07:00 или позднее и заканчиваться в 20:00 или ранее. – Cezar

ответ

1

попробуйте следующее, это предполагает, что раз в порядке

var today = DateTime.UtcNow; 

var bookedTimes = new[] 
{ 
    new DateRange(new DateTime(today.Year, today.Month, today.Day, 07, 00, 00), 
     new DateTime(today.Year, today.Month, today.Day, 09, 00, 00)), 
    new DateRange(new DateTime(today.Year, today.Month, today.Day, 09, 00, 00), 
     new DateTime(today.Year, today.Month, today.Day, 11, 00, 00)), 
    new DateRange(new DateTime(today.Year, today.Month, today.Day, 13, 00, 00), 
     new DateTime(today.Year, today.Month, today.Day, 14, 00, 00)), 
    new DateRange(new DateTime(today.Year, today.Month, today.Day, 18, 00, 00), 
     new DateTime(today.Year, today.Month, today.Day, 20, 00, 00)), 
}; 

var freeTimes = new List<DateRange>(); 
for (var i = 0; i < bookedTimes.Length -1; i++) 
{ 
    var current = bookedTimes[i]; 
    var next = bookedTimes[i + 1]; 

    if (current.To != next.From) 
    { 
     var range = new DateRange(current.To, next.From); 
     freeTimes.Add(range); 
    } 
} 

foreach (var time in freeTimes) 
{ 
    Console.WriteLine($"From {time.From.ToShortTimeString()}, to: {time.To.ToShortTimeString()}"); 
} 

// Outputs: 
// From 11:00, to: 13:00 
// From 14:00, to: 18:00 
+0

Отлично. Просто подумал, что есть функция или метод, которые я мог бы использовать после точки, но, похоже, это должно быть написано нами самим. благодаря – Cezar

0

Вы можете также использовать метод Zip Linq присоединиться к списку себе 1 запись, кроме создания списка пробелов & затем отфильтровать записи, где в начало & конечное время такое же.

var gaplist = 
     eventlist.Zip(eventlist.Skip(1), (ev1, ev2) => new MyEvent(ev1.End, ev1.Start)) 
       .Where(gp => gp.Start != gp.End) 
       .ToList(); 
Смежные вопросы