Jeśli mam okres czasu, powiedzmy DateFrom
i DateTo
i mam listę dat, daty te będą podzielonymi datami. Na przykład:Podziel okres na wiele okresów
DateTime dateFrom = new DateTime(2012, 1, 1);
DateTime dateTo = new DateTime(2012, 12, 31);
List<DateTime> splitDates = new List<DateTime>
{
new DateTime(2012,2,1),
new DateTime(2012,5,1),
new DateTime(2012,7,1),
new DateTime(2012,11,1),
};
List<Tuple<DateTime, DateTime>> periods = SplitDatePeriod(dateFrom, dateTo, splitDates);
Chcę wynikiem będzie wykaz okresów, więc dla poprzedniego przykładu wynik powinien być:
(01/01/2012 - 01/02/2012)
(02/02/2012 - 01/05/2012)
(02/05/2012 - 01/07/2012)
(02/07/2012 - 01/11/2012)
(02/11/2012 - 31/12/2012)
już napisał metodę, aby to zrobić:
List<Tuple<DateTime, DateTime>> SplitDatePeriod(DateTime dateFrom, DateTime dateTo, List<DateTime> splitDates)
{
var resultDates = new List<Tuple<DateTime, DateTime>>();
// sort split dates
List<DateTime> _splitDates = splitDates.OrderBy(d => d.Date).ToList();
DateTime _curDate = dateFrom.Date;
for (int i = 0; i <= _splitDates.Count; ++i)
{
DateTime d = (i < _splitDates.Count) ? _splitDates[i] : dateTo;
// skip dates out of range
if (d.Date < dateFrom.Date || d.Date > dateTo.Date)
continue;
resultDates.Add(Tuple.Create(_curDate, d));
_curDate = d.AddDays(1);
}
return resultDates;
}
Pytanie
to wygląda tak brzydki, Czy istnieje bardziej schludny i krótszy sposób to zrobić? używając Linq może?
lepiej pasuje do [Code Review] (http://codereview.stackexchange.com/) –
jak 'TimeSpan'? –
@RitchMelton Wierzę, że 'TimeSpan' nie ma tu nic do roboty ... –