如何使用可变步数获得可枚举范围

How to get enumerable range with a variable step count

我正在尝试获取一个列表,范围从最小值到最大值,步数可变。

例如: 如果我将最小值设置为 10,000,最大值为 150,000,步数为 20,000。我应该能够得到列表 [10000,30000,50000,70000,...,150000].

类似的,如果步数设置为 15,000 - 我应该得到列表 [10000,25000,40000,...,145000]

 int min = 10000;
 int max = 150000;
 int step = 20000;

 var result = Enumerable.Range( min, max).Where(i => i<= max && (i % step == 0));
 foreach (int num in result) { Console.WriteLine(num); } // output: [20000,40000,60000,80000,100000,120000,140000]

由于我使用模数运算符将零值等同起来,它会跳过范围内的第一个值并给我上面的结果而不是 [10000,30000,..,150000]。 由于我是 C# 编程的新手,任何人都可以用上面的代码纠正我以获得所需的输出。

PS:我已经参考了这个帖子 How to get alternate numbers using Enumerable.Range? 但找不到答案。

你只需要修改你的Linq语句中的where条件:

var result = Enumerable.Range(min, max - min + 1).Where(i => (i - min) % step == 0);

计算istep的模是否为0时,忘记减去起始值min。通过减去 min,您可以偏移模计算以与 i 偏移 min 的值进行比较,而不是使用 i.

step为20000时的输出:

10000
30000
50000
70000
90000
110000
130000
150000

step为15000时的输出:

10000
25000
40000
55000
70000
85000
100000
115000
130000
145000

创建自定义迭代器可能比重用现有的 Enumerable.Range 方法更容易。

public static IEnumerable<int> Range(int min, int max, int step)
{
    for (int i = min; i <= max; i = checked(i + step)) yield return i;
}