1

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

4 に答える 4