2012-07-23 8 views

Odpowiedz

6

Nie ma wbudowanego typu, który definiuje przedział czasowy, ale można go łatwo utworzyć, łącząc DateTime i TimeSpan. Na przykład:

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

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

Następnie można zbudować List<TimeRange> stosując specyficzną DateTime jako punkt wyjścia i dodanie wymaganej TimeSpan dla każdego elementu. Na przykład, jest to bardzo prosta implementacja TimeRange, w tym metoda o nazwie Split, która zwraca wartość IEnumerable<TimeRange> na podstawie bieżącego TimeRange i wymaganego czasu trwania podzakresów.

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

Następnie można zrobić coś takiego:

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

To da listę 12 przedziałach czasowych trwających 1 godzinę, począwszy od chwili obecnej.

** Aktualizacja **

Należy zauważyć, że powyższa implementacja jest bardzo proste. Metoda Split, na przykład, z łatwością wytworzy zakresy, w których koniec ostatniego podzakresu wykracza poza koniec zakresu macierzystego, jeśli podokres nie jest całkowitym podziałem zakresu macierzystego. Trudno byłoby jednak dodać kontrole tego typu rzeczy. Prawdziwe pytanie brzmi, co chcesz zrobić w tego rodzaju scenariuszach.

Byłoby również bardzo łatwo stworzyć statyczną metodę TimeRange.CreateList, która buduje model List<TimeRange> bez potrzeby stosowania jawnego zakresu nadrzędnego.

+0

To jest bardzo dobra odpowiedź. Jeśli czas trwania ustawię na 2, czy otrzymam dokładnie 2 godziny? na przykład: TimeRange (10,2), więc otrzymuję od 10 do 12 jako zakres? –

+0

Mam ochotę po prostu powiedzieć "spróbuj i zobacz", ale tak, to właśnie dostaniesz. Możesz także użyć czasu 'new TimeSpan (1, 30, 0)', aby uzyskać na przykład zakres 1,5 godziny (np. Od 10:00 do 11:30). –

+0

Dziękuję bardzo za odpowiedź. –

Powiązane problemy