Non esiste un tipo predefinito che definisca un intervallo di tempo, ma sarebbe piuttosto facile crearne uno combinando uno DateTime
e uno TimeSpan
. Per esempio:
struct TimeRange
{
private readonly DateTime start;
private readonly TimeSpan duration;
public TimeRange (DateTime start, TimeSpan duration)
{
this.start = start;
this.duration = duration;
}
}
È quindi possibile costruire un List<TimeRange>
utilizzando uno specifico DateTime
come punto di partenza e aggiungendo la necessaria TimeSpan
per ogni elemento. Ad esempio, ecco un'implementazione molto semplice di TimeRange
che include un metodo chiamato Split
che restituisce un valore IEnumerable<TimeRange>
in base all'attuale TimeRange
e alla durata richiesta dei sottointervalli.
struct TimeRange
{
private readonly DateTime start;
private readonly TimeSpan duration;
public TimeRange (DateTime start, TimeSpan duration)
{
this.start = start;
this.duration = duration;
}
public DateTime From { get { return start; } }
public DateTime To { get { return start + duration; } }
public TimeSpan Duration { get { return duration; } }
public IEnumerable<TimeRange> Split (TimeSpan subDuration)
{
for (DateTime subRangeStart = From; subRangeStart < this.To; subRangeStart += subDuration)
{
yield return new TimeRange(subRangeStart, subDuration);
}
}
public override string ToString()
{
return String.Format ("{0} -> {1}", From, To);
}
}
È quindi possibile fare qualcosa del genere:
TimeRange mainRange = new TimeRange(DateTime.Now, new TimeSpan(12, 0, 0));
List<TimeRange> rangeList = mainRange.Split(new TimeSpan(1, 0, 0)).ToList();
Questo vi darà una lista di 12 intervalli di tempo della durata di 1 ora a partire dal tempo corrente.
** Aggiornamento **
Si noti che quanto sopra implementazione è molto semplice. Il metodo Split
, ad esempio, produrrà felicemente un littore di intervalli in cui la fine dell'ultimo sottogruppo va oltre la fine dell'intervallo genitore se la durata secondaria non è una divisione integrale dell'intervallo genitore. Sarebbe difficile aggiungere controlli per questo genere di cose, però. La vera domanda è cosa vuoi che succeda in quel tipo di scenari.
Sarebbe anche molto facile creare un metodo statico TimeRange.CreateList
che crea un List<TimeRange>
senza la necessità di un intervallo genitore esplicito.
Questa è una buona risposta. Se la durata è impostata su 2, ottengo esattamente 2 ore? per esempio: TimeRange (10,2) quindi ho 10-12 come intervallo? –
Sono tentato di dire "prova e vedi" ma, sì, è quello che otterrai. Puoi anche usare una durata di 'new TimeSpan (1, 30, 0)' per ottenere un intervallo di 1,5 ore (ad esempio da 10:00 a 11:30), ad esempio. –
Grazie mille per la risposta. –