2010-05-08 3 views
1

Предоставлено список дат (который не может быть отсортирован), я хочу, чтобы создать список диапазонов дат -C диапазоны дат # высчитывает из списка дат

Э.Г. Предполагая, что формат ММ/ДД,

вход - 5/1, 5/5, 5/6, 5/15, 5/7, 5/8, 5/19,5/20, 5/23

Выход -

 
Date Range 1: 5/1 to 5/1 
Date Range 2: 5/5 to 5/8 
Date Range 3: 5/15 to 5/15 
Date Range 4: 5/19 to 5/20 
Date Range 5: 5/23 to 5/23 

В основном, диапазон должен быть непрерывным.

+1

Можете ли вы опубликовать код, который вы получили до сих пор, и сообщить нам, что не работает? – Oded

+0

Пахнет домашней работой. Отметьте это как таковое и добавьте то, что вы сделали, и какие конкретные проблемы у вас есть с предлагаемым решением. –

+1

Как вы когда-либо получали эти диапазоны от этого ввода? Похоже, правильный ответ будет иметь 'rand.Next()' где-то в нем ... –

ответ

0

Вы можете создать список DateTime (возможно, используя тот же самый год для них) и отсортировать его.

Это довольно легко найти, если день и следующий день существуют в списке (используя DateTime.AddDays(1)).

5
  1. Сортировать даты
  2. Start диапазон, содержащий следующую дату (для начала с ним будет первый один)
  3. Является вторым «действительным» дата следующей датой, которая будет находиться в диапазоне? Если да, продолжайте идти. Если нет, закройте текущий диапазон и запустите новый.
  4. Повторяйте до тех пор, пока не закончите даты, после чего вы закроете текущий диапазон, и все готово.
0
public class DateRange 
{ 
    public DateTime Start { get; set; } 
    public DateTime End { get; set; } 
} 

[TestClass] 
public class DateRangerTest 
{ 

    private List<DateRange> GetDateRanges(List<DateTime> dates) 
    { 
     if (dates == null || !dates.Any()) return null; 
     dates = dates.OrderBy(x => x.Date).ToList(); 

     var dateRangeList = new List<DateRange>(); 

     DateRange dateRange = null; 
     for (var i = 0; i < dates.Count; i++) 
     { 
      if (dateRange == null) 
      { 
       dateRange = new DateRange { Start = dates[i] }; 
      } 
      if (i == dates.Count - 1 || dates[i].Date.AddDays(1) != dates[i + 1].Date) 
      { 
       dateRange.End = dates[i].Date; 
       dateRangeList.Add(dateRange); 
       dateRange = null; 
      } 
     } 
     return dateRangeList; 
    } 

    [TestMethod] 
    public void GetDateRanges_MultiDateRangeTest() 
    { 
     var dates = new List<DateTime> 
     { 
      new DateTime(1999,5,1), 
      new DateTime(1999,5,5), 
      new DateTime(1999,5,6), 
      new DateTime(1999,5,15), 
      new DateTime(1999,5,7), 
      new DateTime(1999,5,8), 
      new DateTime(1999,5,19), 
      new DateTime(1999,5,20), 
      new DateTime(1999,5,23) 
     }; 

     var dateRanges = GetDateRanges(dates); 

     Assert.AreEqual(new DateTime(1999, 5, 1), dateRanges[0].Start); 
     Assert.AreEqual(new DateTime(1999, 5, 1), dateRanges[0].End); 

     Assert.AreEqual(new DateTime(1999, 5, 5), dateRanges[1].Start); 
     Assert.AreEqual(new DateTime(1999, 5, 8), dateRanges[1].End); 

     Assert.AreEqual(new DateTime(1999, 5, 15), dateRanges[2].Start); 
     Assert.AreEqual(new DateTime(1999, 5, 15), dateRanges[2].End); 

     Assert.AreEqual(new DateTime(1999, 5, 19), dateRanges[3].Start); 
     Assert.AreEqual(new DateTime(1999, 5, 20), dateRanges[3].End); 

     Assert.AreEqual(new DateTime(1999, 5, 23), dateRanges[4].Start); 
     Assert.AreEqual(new DateTime(1999, 5, 23), dateRanges[4].End); 
    } 
} 
Смежные вопросы