Еще один вариант реализации шаблона проектирования Iterator:
Это может показаться ненужным, но я, в зависимости от того, как вы используете эту функцию, вы также можете реализовать шаблон проектирования 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), или другой, который вместо этого использует Calendar. И т. Д.
Идея состоит в том, чтобы уменьшить связь между объектами.
Опять же, это было бы излишним для большинства случаев, но если итерация образует релевантную часть системы (скажем, вы создаете какое-то какое-либо уведомление для предприятия, и следует придерживаться различных глобализаций
Базовая реализация, конечно, будет использовать for.
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;
}
}
}
Просто идея :)