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