迭代范围值

来源:互联网 发布:传智播客java百度云盘 编辑:程序博客网 时间:2024/04/27 22:59

迭代需求:

范围值定义起始值和结束值;

防止反向范围,即起始值大于结束值;

必须能够把元素类型的一个值和另一个值进行比较;

能狗在范围值之中找出某个特定的值是否存在;

能够轻易迭代整个范围值;

namespace 迭代范围值1{    public abstract class Range<T>:IEnumerable<T>        where T:IComparable<T>    {        readonly T start;        readonly T end;        public Range(T start,T end)        {            if(start.CompareTo(end)>0)//防止反向范围值;x.CompareTo(y)>0就等同于x>y            {                throw new ArgumentOutOfRangeException();            }            this.start = start;            this.end = end;        }        public T Start        {            get { return start; }        }        public T End        {            get { return end; }        }        public bool Contains(T value)        {            return value.CompareTo(start) >= 0 && value.CompareTo(end) <= 0;        }        public IEnumerator<T> GetEnumerator()//隐式实现GetEnumerator()        {            T value = start;            while(value.CompareTo(end)<0)            {                yield return value;                value = GetNextValue(value);            }            if(value.CompareTo(end)==0)            {                yield return value;            }        }        IEnumerator IEnumerable.GetEnumerator()//显式实现GetEnumerator()        {            return GetEnumerator();        }        protected abstract T GetNextValue(T current);    }

从Range派生出的类,用于迭代日期/时间

设置步长;

 public class DateTimeRange:Range<DateTime>    {        readonly TimeSpan step;        public DateTimeRange(DateTime start,DateTime end):this(start,end,TimeSpan.FromDays(1))//使用默认的步长        { }        public DateTimeRange(DateTime start,DateTime end,TimeSpan step):base(start,end)//使用指定的步长        {            this.step = step;        }        protected override DateTime GetNextValue(DateTime current)//使用步长查找下一个值        {            return current + step;        }    }

0 0
原创粉丝点击