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); }