2012-07-23 9 views
5

C'è un modo per creare un elenco di intervalli di tempo? Ad esempio: Un elenco contenente: 12:00 a 1:00 pm 1:00 to 2:00 pm ecc ... Dove la sezione di divisione è la configurazione. Penso che devi usare datetime e dividerlo in un certo numero (in questo caso un'ora)C# C'è un modo per creare un elenco di intervalli di tempo? Configurabile

Qualcuno potrebbe indicarmi la direzione giusta o fornirmi un esempio?

Grazie in anticipo!

risposta

6

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.

+0

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? –

+0

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. –

+0

Grazie mille per la risposta. –

Problemi correlati