2013 1 1 から 2015 1 1 までの日付を印刷しようとしています。
問題は、MoveNext が current の前に呼び出されるため、2013 2 1 で印刷を開始することです。私が知っているのは、必要なものに近くない enumerable.range だけです。2)bool hasStarted
問題を解決するには、MoveNext で a を使用してチェックするのが最も一般的ですか?
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;
}
}
}