2009-02-10 2 views

ответ

75

Я хотел бы использовать цикл, который выглядит, как этот

for(DateTime date = begin; date <= end; date = date.AddDays(1)) 
{ 
} 

Установить начало и конец соответственно

6
DateTime dateTime = new DateTime(2009, 1, 1);  

while(dateTime.Year < 2010) 
    { 

     dateTime = dateTime.AddDays(1); 
    } 
+2

Добавить дни возвращает DateTime, а не увеличивает DateTime, в котором он работает. – Ray

3

установить две переменные:

DateTime lowValue = DateTime.Parse("1/1/2009"); 
DateTime highValue = DateTime.Parse("12/31/2009"); 

Затем добавьте в день в низкое значение, пока оно не будет равно высокому значению:

while (lowValue <= highValue) 
{ 
    //Do stuff here 
    lowValue = lowValue.AddDays(1); 
} 

Или что-то в этом роде.

+0

исправлено ваше задание и ошибки. –

+0

и ошибка «один за другим» –

0
DateTime current = DateTime.Parse("1/1/2009"); 
DateTime nextYear = current.AddYears(1); 
do 
{ 
    Console.WriteLine(current); 
    current = current.AddDays(1); 
} while (current < nextYear) ; 
1

int day; for (int i = 1; i<365;i++) { day++; }

К сожалению, не смог устоять.

+1

как это сделать для високосного года? – 2013-04-15 13:26:35

+0

@ user1542476 вы бы просто использовали 366. – Kristopher

5

Я хотел бы использовать MiscUtil и его методы расширения:

foreach(DateTime date in 1.January(2009) 
         .To(31.December(2009)) 
         .Step(1.Days()) 
{ 
    Console.WriteLine(date); 
} 
18

Другой вариант реализации шаблона проектирования итератора:

Это может звучать ненужно, но в зависимости от того, как использовать эту функцию , вы также можете реализовать Iterator design pattern.

Подумайте об этом. Предположим, что все работает очень хорошо, и вы копируете/вставляете по всему месту предложение «для». И вдруг, как часть требований, вы должны повторять все дни, но пропустите некоторые из них (например, в календаре, пропущенных праздниках, выходных, пользовательских и т. Д.)

Вам нужно будет создать новый «отрезанный» и использовать Календарь вместо этого. Затем выполните поиск и замените все ваши.

В ООП это может быть достигнуто с использованием шаблона итератора.

От Wikpedia:

В объектно-ориентированном программировании, шаблон итератора является шаблон дизайна, в котором итераторы используются для доступа к элементам совокупного объекта последовательно , не подвергая его основное представление. Объект Iterator инкапсулирует внутреннюю структуру того, как происходит итерация.

Так идея заключается в том, чтобы использовать конструкцию вроде этого:

 DateTime fromDate = DateTime.Parse("1/1/2009"); 
     DateTime toDate = DateTime.Parse("12/31/2009"); 

     // Create an instance of the collection class 
     DateTimeEnumerator dateTimeRange = 
           new DateTimeEnumerator(fromDate, toDate); 


     // Iterate with foreach 
     foreach (DateTime day in dateTimeRange) 
     { 
      System.Console.Write(day + " "); 
     } 

И затем, при необходимости вы можете создавать подклассы для реализации различных алгоритмов, тот, который использует AddDay (1), другой, который использует AddDay (7) или другое, которое просто использует Календарь вместо этого. И т.д.

Идея состоит в том, чтобы опустить связь между объектами.

Опять же, это было бы излишним для большинства случаев, но если итерационные образует отношения части системы (скажем, вы создаете какое-то какое-то уведомление, для предприятия, и должен придерживаться различные глобализаций

Основная реализация курса будет использовать для.

public class DateTimeEnumerator : System.Collections.IEnumerable 
{ 
    private DateTime begin; 
    private DateTime end; 

    public DateTimeEnumerator (DateTime begin , DateTime end) 
    { 
     // probably create a defensive copy here... 
     this.begin = begin; 
     this.end = end; 
    } 
    public System.Collections.IEnumerator GetEnumerator() 
    { 
     for(DateTime date = begin; date < end; date = date.AddDays(1)) 
     { 
      yield return date; 
     } 
    } 
} 

Просто идея :)

2

альтернативный метод, который может быть повторно используемым, чтобы ш обведите метод расширения в DateTime и верните IEnumerable.

Например, вы можете определить класс:

public static class MyExtensions 
{ 
    public static IEnumerable EachDay(this DateTime start, DateTime end) 
    { 
     // Remove time info from start date (we only care about day). 
     DateTime currentDay = new DateTime(start.Year, start.Month, start.Day); 
     while (currentDay <= end) 
     { 
      yield return currentDay; 
      currentDay = currentDay.AddDays(1); 
     } 
    } 
} 

Теперь в коде вызова вы можете сделать следующее:

DateTime start = DateTime.Now; 
DateTime end = start.AddDays(20); 
foreach (var day in start.EachDay(end)) 
{ 
    ... 
} 

Еще одно преимущество такого подхода состоит в том, что она делает его тривиальным добавьте EveryWeek, EveryMonth и т. д. Затем они будут доступны в DateTime.

Смежные вопросы