2 * Karinto Library Project
\r
4 * This software is distributed under a zlib-style license.
\r
5 * See license.txt for more information.
\r
9 using System.Collections.Generic;
\r
18 #region constructors
\r
22 /// <param name="first">最初の要素</param>
\r
23 /// <param name="last">最後の要素</param>
\r
24 public Range(IComparable first, IComparable last)
\r
25 : this(first, last, false)
\r
32 /// <param name="first">最初の要素</param>
\r
33 /// <param name="last">最後の要素</param>
\r
34 /// <param name="isExcludeEnd">終端を含むか否か(含まないときtrue)</param>
\r
35 public Range(IComparable first, IComparable last, bool excludeEnd)
\r
37 if (first.GetType() != last.GetType())
\r
39 throw new ArgumentException("The boundary elements must be same type.");
\r
43 ExcludesEnd = excludeEnd;
\r
48 public IComparable First { get; private set; }
\r
49 public IComparable Last { get; private set; }
\r
50 public bool ExcludesEnd { get; private set; }
\r
53 #region public methods
\r
57 /// <param name="other">対象</param>
\r
58 /// <returns>範囲内か否か(範囲内ならtrue)</returns>
\r
59 public bool Includes(IComparable other)
\r
61 if (other.CompareTo(First) < 0) return false;
\r
62 if (other.CompareTo(Last) > 0) return false;
\r
63 if (other.CompareTo(Last) == 0) return !ExcludesEnd;
\r
68 /// 両端に値を加算することで範囲を移動させる
\r
70 /// <param name="delta">変化量</param>
\r
71 public void Shift(double delta)
\r
73 First = (double)First + delta;
\r
74 Last = (double)Last + delta;
\r
78 /// 両端に値を加算することで範囲を移動させる
\r
80 /// <param name="delta">変化量</param>
\r
81 public void Shift(int delta)
\r
83 First = (int)First + delta;
\r
84 Last = (int)Last + delta;
\r
87 public IEnumerator<Int32> GetEnumerator()
\r
89 Int32 cursor = Convert.ToInt32(First);
\r
90 Int32 last = Convert.ToInt32(Last);
\r
91 while (cursor < last)
\r
93 yield return cursor;
\r
98 if (!ExcludesEnd) yield return cursor;
\r
105 /// <param name="step">刻み</param>
\r
106 /// <returns>step刻みの範囲内の要素</returns>
\r
107 public IEnumerable<Int32> Step(Int32 step)
\r
109 Int32 cursor = Convert.ToInt32(First);
\r
110 Int32 last = Convert.ToInt32(Last);
\r
111 while (cursor < last)
\r
113 yield return cursor;
\r
116 if (cursor == last)
\r
118 if (!ExcludesEnd) yield return cursor;
\r
125 /// <param name="stepWidth">刻み</param>
\r
126 /// <returns>step刻みの範囲内の要素</returns>
\r
127 public IEnumerable<double> Step(double stepWidth)
\r
130 double first = Convert.ToDouble(First);
\r
131 double last = Convert.ToDouble(Last);
\r
132 double cursor = first;
\r
133 while (cursor < last)
\r
135 yield return cursor;
\r
137 cursor = first + stepWidth * i;//単純に加算していくと誤差が蓄積する
\r
139 if (cursor == last)
\r
141 if (!ExcludesEnd) yield return cursor;
\r