如何使用可变步长获取可枚举范围



我正在尝试获取具有可变步数的最小值和最大值的列表。

例如: 如果我将最小值设置为 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:我已经提到了这个线程如何使用枚举范围获取备用号码? 但找不到答案。

创建自定义迭代器可能比重用现有的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;
}

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

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

当将ivsstep的模数是否等于 0 时,您忘记min减去起始值。 通过减去min,您可以偏移模数计算,以与偏移量imin的值进行比较,而不是使用i

步长为 20,000 时的输出:

10000
30000
50000
70000
90000
110000
130000
150000

步长为 15,000 时的输出:

10000
25000
40000
55000
70000
85000
100000
115000
130000
145000

最新更新