Просто кидаю мій капелюх на ринг.
Я визначаю це ...
namespace CustomRanges {
public record IntRange(int From, int Thru, int step = 1) : IEnumerable<int> {
public IEnumerator<int> GetEnumerator() {
for (var i = From; i <= Thru; i += step)
yield return i;
}
IEnumerator IEnumerable.GetEnumerator()
=> GetEnumerator();
};
public static class Definitions {
public static IntRange FromTo(int from, int to, int step = 1)
=> new IntRange(from, to - 1, step);
public static IntRange FromThru(int from, int thru, int step = 1)
=> new IntRange(from, thru, step);
public static IntRange CountFrom(int from, int count)
=> new IntRange(from, from + count - 1);
public static IntRange Count(int count)
=> new IntRange(0, count);
}
}
Потім, де б я не хотів його використовувати, я додаю це у верхній частині файлу ...
using static CustomRanges.Definitions;
І використовувати його так ...
foreach(var index in FromTo(1, 4))
Debug.WriteLine(index);
foreach(var index in FromThru(1, 4))
Debug.WriteLine(index);
foreach(var index in FromThru(2, 10, 2))
Debug.WriteLine(index);
foreach(var index in CountFrom(7, 4))
Debug.WriteLine(index);
foreach(var index in Count(5))
Debug.WriteLine(index);
foreach(var _ in Count(4))
Debug.WriteLine("A");
Приємним у цьому підході є імена, ви точно знаєте, включений кінець чи ні.