Итерация по отдельным периодам времени в течение другого периода времени - PullRequest
1 голос
/ 04 апреля 2011

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

        --------------------------------------------------------
Period: Jan  Feb  March  April  May  Jun  Jul ... n - 1 .... n
        --------------------------------------------------------
Val_1:   5    2    3      6      3    2    4       x         x
Val_2    ...
        --------------------------------------------------------

И у меня есть период с двумя DateTimes, начало и конец, то есть:

DateTime start = new DateTime(2010, 3, 11);
DateTime end = new DateTime(2012, 7, 12);

.. в это время происходит процесс кормления. Как я могу получить значения из таблицы в каждом периоде в соответствии с периодом, заданным началом и концом?

Например, период, указанный в начале и конце, составляет 2,5 года, но моя таблица описывает только 12 месяцев. Как я могу зациклить каждый период в таблице В течение всего периода, заданного началом и концом?

Я придумал что-то вроде этого:

class PeriodTableValue
{
   DateTime period; // Ignore year component of datetime
   double val_1;
   double val_2;
}
void FeedMyFish(double howmuch, DateTime period_start, DateTime period_end)
{
   ...
}
...
PeriodTableValue[] table = ...
DateTime start = ...
DateTime end = ...

DateTime d1 = start;
for(int i = 0; i < table.Length; i++)
{
   DateTime d2 = table[i].period;
   int nI = find the occurrances of period table[i]. How ???
   for(int j = 0; j < nI; j++)
   {
      FeedMyFish(..parameters ???)
   }
   d1 = d2;
}

И я застрял прямо здесь. Пожалуйста, сообщите.

Спасибо!

1 Ответ

0 голосов
/ 04 апреля 2011

Эта статья включает поддержку различных типов периодов и поиск периодов пересечения:

// ----------------------------------------------------------------------
public void TimePeriodIntersectorSample()
{
  TimePeriodCollection periods = new TimePeriodCollection();

  periods.Add( new TimeRange( new DateTime( 2011, 3, 01 ), new DateTime( 2011, 3, 10 ) ) );
  periods.Add( new TimeRange( new DateTime( 2011, 3, 05 ), new DateTime( 2011, 3, 15 ) ) );
  periods.Add( new TimeRange( new DateTime( 2011, 3, 12 ), new DateTime( 2011, 3, 18 ) ) );

  periods.Add( new TimeRange( new DateTime( 2011, 3, 20 ), new DateTime( 2011, 3, 24 ) ) );
  periods.Add( new TimeRange( new DateTime( 2011, 3, 22 ), new DateTime( 2011, 3, 28 ) ) );
  periods.Add( new TimeRange( new DateTime( 2011, 3, 24 ), new DateTime( 2011, 3, 26 ) ) );

  TimePeriodIntersector<TimeRange> periodIntersector = 
                    new TimePeriodIntersector<TimeRange>();
  ITimePeriodCollection intersectedPeriods = periodIntersector.IntersectPeriods( periods );

  foreach ( ITimePeriod intersectedPeriod in intersectedPeriods )
  {
    Console.WriteLine( "Intersected Period: " + intersectedPeriod );
  }
  // > Intersected Period: 05.03.2011 - 10.03.2011 | 5.00:00
  // > Intersected Period: 12.03.2011 - 15.03.2011 | 3.00:00
  // > Intersected Period: 22.03.2011 - 26.03.2011 | 4.00:00
} // TimePeriodIntersectorSample
...