Se ho un periodo di tempo, diciamo DateFrom
e DateTo
e ho un elenco di date, Queste date saranno le date di divisione. Per esempio:Dividere un periodo di tempo in più periodi di tempo
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);
Voglio che il risultato sia un elenco di periodi, così per l'esempio precedente, il risultato dovrebbe essere:
(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)
Ho già scritto un metodo per farlo:
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;
}
La questione
sembra così brutto, c'è modo più accurato e più breve di fare questo? usando Linq forse?
si adatta meglio al [Code Review] (http://codereview.stackexchange.com/) –
come 'TimeSpan'? –
@RitchMelton Credo che 'TimeSpan' non abbia nulla da fare qui ... –