我正在尝试打印从 2013 年 1 1 开始到 2015 年 1 1 结束的日期。
问题是 MoveNext 在 current 之前调用,因此它在 2013 2 1 开始打印。我的问题是 1).NET 中是否已经存在某种类型的 Range 类?我只知道 enumerable.range 不符合我的需要。2) 使用 abool hasStarted
并在 MoveNext 中检查它是解决我的问题的最惯用的方法吗?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DateTest
{
class Program
{
static void Main(string[] args)
{
foreach (var m in Range.Create(new DateTime(2013, 1, 1), new DateTime(2015, 1, 1), s => s.AddMonths(1)))
Console.WriteLine(m);
}
}
static class Range { public static Range<T> Create<T>(T s, T e, Func<T, T> inc) where T : IComparable<T> { return new Range<T>(s, e, inc); } }
class Range<T> : IEnumerable<T>, IEnumerator<T> where T : IComparable<T>
{
T start, pos, end;
Func<T,T> inc;
public Range(T s, T e, Func<T,T> inc) { pos=start= s; end = e; this.inc = inc; }
public T Current
{
get { return pos; }
}
public void Dispose()
{
//throw new NotImplementedException();
}
object System.Collections.IEnumerator.Current
{
get { return pos; }
}
public bool MoveNext()
{
pos = inc(pos);
return pos.CompareTo(end) < 0;
}
public void Reset()
{
pos = start;
}
public IEnumerator<T> GetEnumerator()
{
return this;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this;
}
}
}