Учитывая дату начала 01.01.2009 и дату окончания 12/31/2009, как я могу перебирать каждую дату и получать значение DateTime с помощью С#?
Спасибо!
Учитывая дату начала 01.01.2009 и дату окончания 12/31/2009, как я могу перебирать каждую дату и получать значение DateTime с помощью С#?
Спасибо!
Я бы использовал цикл, который выглядит так:
for(DateTime date = begin; date <= end; date = date.AddDays(1))
{
}
Установите начало и конец соответственно
Другой вариант реализации шаблона проектирования Iterator:
Это может показаться ненужным, но в зависимости от того, как вы используете эту функциональность, вы также можете реализовать шаблон дизайна Iterator.
Подумайте об этом. Предположим, что все работает очень хорошо, и вы копируете/вставляете по всему месту предложение "для". И внезапно, как часть требований, вы должны повторять все дни, но пропустите некоторые из них (например, в календаре, пропустить выходные, выходные, обычай и т.д.).
Вам нужно будет создать новый "отрезанный" и вместо этого использовать Календарь. Затем выполните поиск и замените все ваши.
В ООП это может быть достигнуто с использованием шаблона Итератора.
Из Википедии:
В объектно-ориентированном программировании шаблон Итератора представляет собой шаблон проектирования, в котором итераторы используются для доступа к элементам агрегатного объекта последовательно без раскрытия его основного представления. Объект 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;
        }
    }
}
Просто идея:)
DateTime dateTime = new DateTime(2009, 1, 1);    
while(dateTime.Year < 2010)
    {
      dateTime = dateTime.AddDays(1);
    }
Я бы использовал MiscUtil и его методы расширения:
foreach(DateTime date in 1.January(2009)
                         .To(31.December(2009))
                         .Step(1.Days())
{
    Console.WriteLine(date);
}
Задайте две переменные:
DateTime lowValue = DateTime.Parse("1/1/2009");
DateTime highValue = DateTime.Parse("12/31/2009");
Затем добавьте день к низкому значению, пока оно не будет равно highvalue:
while (lowValue <= highValue)
{
   //Do stuff here
   lowValue = lowValue.AddDays(1);
}
Или что-то в этом роде.
Альтернативным методом, который может быть более многоразовым, является запись метода расширения в 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.
 int day;
for (int i = 1; i<365;i++)
{
day++;
}
Извините, не смог устоять.
DateTime current = DateTime.Parse("1/1/2009");
DateTime nextYear = current.AddYears(1);
do
{
    Console.WriteLine(current);
    current = current.AddDays(1);
} while (current < nextYear) ;