Thanks to dlev for suggesting Func
, I was originally just using a helper class.
public class Sequence<T> : IEnumerable<T>
{
public T Start { get; private set; }
public T Interval { get; private set; }
private Func<T, T, T> Adder { get; set; }
public Sequence(T start, T interval, Func<T,T,T> adder)
{
Start = start;
Interval = interval;
Adder = adder;
}
public IEnumerator<T> GetEnumerator()
{
for (T n = Start; ; n = Adder.Invoke(n, Interval))
yield return n;
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
You can then use it like this:
int i = 0;
foreach (int t in new Sequence<int>(3, 4, (int a, int b) => a + b))
{
if (i == 10)
{
break;
}
i++;
Console.WriteLine(t);
}
Alternatively, you could require that T
implement some sort of Addable
interface and call that Add
method, but I think this is cleaner all around.