Esempio n. 1
0
        public virtual ITimeSeries Zoomout(TimeUnit tu, DateTime begin, DateTime end)
        {
            Func <List <T>, T> merger = this.getElementMerger();

            if (merger == null)
            {
                return(null);
            }
            if (this.Count <= 0)
            {
                return(null);
            }
            if (begin < this[0].Date)
            {
                begin = this[0].Date;
            }
            if (end > this[this.Count - 1].Date)
            {
                end = this[this.Count - 1].Date;
            }

            List <T>       items  = new List <T>();
            TimeSeries <T> result = (TimeSeries <T>) this.GetType().GetConstructor(new Type[] { typeof(String), typeof(TimeUnit) }).Invoke(new Object[] { code, tu });

            /*
             * DateTime d = begin;
             * KeyValuePair<int, ITimeSeriesItem> kv = this.GetNearest(d);
             * if (kv.Value == null)
             *  return null;
             * int index = kv.Key;
             * while(index < this.Count)
             * {
             *  int n = CalendarUtils.TimeUnitGetSerialNo(this[index].Date,tu);
             *  if (n == 1)
             *      break;
             *  index += 1;
             * }
             *
             * DateTime[] dayRange = null;
             * for (int i=index;i<this.Count;i++)
             * {
             *  d = this[i].Date;
             *  if(dayRange == null)
             *      dayRange = CalendarUtils.TimeUnitRange(d, tu);
             *  if(d<=dayRange[1])
             *  {
             *      items.Add(this[i]);
             *      continue;
             *  }
             *  T newItem = merger(items);
             *  if (newItem != null)
             *      result.Add(newItem);
             *  dayRange = null;
             *
             * }
             */

            DateTime d = begin;

            while (d <= end)
            {
                DateTime[] dayRange = CalendarUtils.TimeUnitRange(d, tu); //找到d所在的周期的第一天
                KeyValuePair <int, ITimeSeriesItem> kvBegin = this.GetNearest(dayRange[0]);
                KeyValuePair <int, ITimeSeriesItem> kvEnd   = this.GetNearest(dayRange[1]);
                items.Clear();
                for (int i = kvBegin.Key; i <= kvEnd.Key; i++)
                {
                    items.Add(this[i]);
                }
                T newItem = merger(items);
                if (newItem != null)
                {
                    result.Add(newItem);
                }
                d = CalendarUtils.TimeUnitNextDate(d, tu);
            }

            return(result);
        }