public static IEnumerable<int> range(int begin, int end, int step)
{
if (0 ==step)
{
throw new ArgumentOutOfRangeException("step == 0");
}
if (step < 0)
{
if (begin < end)
{
throw new ArgumentOutOfRangeException("begin < end && step < 0");
}
for (int i = begin; i > end; i += step) yield return i;
}
else
{
if (begin > end)
{
throw new ArgumentOutOfRangeException("begin > end && step > 0");
}
for (int i = begin; i < end; i += step) yield return i;
}
}