2012-07-23 11 views
5

¿Hay alguna manera de hacer una lista de rango de tiempo? Por ejemplo: Una lista que contiene: 12:00 a 1:00 pm 1:00 a 2:00 pm etc ... Donde la sección divisoria es la configuración. Creo que tiene que usar datetime y dividirlo en un cierto número (en este caso una hora)C# ¿Hay alguna manera de hacer una lista de rango de tiempo? Configurable

¿Podría alguien indicarme la dirección correcta o darme un ejemplo?

¡Gracias de antemano!

Respuesta

6

No hay un tipo incorporado que defina un rango de tiempo, pero sería bastante fácil crear uno combinando un DateTime y un TimeSpan. Por ejemplo:

struct TimeRange 
{ 
    private readonly DateTime start; 
    private readonly TimeSpan duration; 

    public TimeRange (DateTime start, TimeSpan duration) 
    { 
     this.start = start; 
     this.duration = duration; 
    } 
} 

A continuación, podría construir una List<TimeRange> utilizando una específica DateTime como punto de partida y añadiendo la TimeSpan requerida para cada elemento. Por ejemplo, aquí hay una implementación muy básica de TimeRange que incluye un método llamado Split que devuelve un IEnumerable<TimeRange> basado en el actual TimeRange y la duración requerida de los subintervalos.

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); 
    } 
} 

A continuación, puede hacer algo como esto:

TimeRange mainRange = new TimeRange(DateTime.Now, new TimeSpan(12, 0, 0)); 
List<TimeRange> rangeList = mainRange.Split(new TimeSpan(1, 0, 0)).ToList(); 

Esto le dará una lista de 12 intervalos de tiempo de duración de 1 hora a partir de la hora actual.

** Actualización **

Tenga en cuenta que la aplicación anterior es muy básico. El método Split, por ejemplo, producirá felizmente un lits de rangos donde el final del último subintervalo está más allá del final del rango principal si la sub-duración no es una división integral del rango principal. Sin embargo, sería difícil agregar cheques para este tipo de cosas. La verdadera pregunta es qué quieres que suceda en ese tipo de escenarios.

También sería muy fácil crear un método TimeRange.CreateList estático que genere un List<TimeRange> sin la necesidad de un rango primario explícito.

+0

Esta es una muy buena respuesta. Si la duración se establece en 2, ¿obtengo exactamente 2 horas? por ejemplo: TimeRange (10,2) así que obtengo 10 a 12 como un rango? –

+0

Tengo la tentación de decir "pruébalo y ve" pero, sí, eso es lo que obtendrás. También puede usar una duración de 'new TimeSpan (1, 30, 0)' para obtener un rango de 1,5 horas (por ejemplo, de 10:00 a 11:30), por ejemplo. –

+0

Muchas gracias por su respuesta. –

Cuestiones relacionadas