迭代需求:
范围值定义起始值和结束值;
防止反向范围,即起始值大于结束值;
必须能够把元素类型的一个值和另一个值进行比较;
能狗在范围值之中找出某个特定的值是否存在;
能够轻易迭代整个范围值;
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;
}
}