[英]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:我已經提到了這個線程如何使用 Enumerable.Range 獲取備用數字? 但無法找到答案。
創建自定義迭代器可能比重用現有的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);
當等於i
vs step
的模數是否為 0 時,您忘記減去起始值min
。 通過減去min
,您可以抵消模計算以與i
偏移min
的值進行比較,而不是使用i
。
步長為 20,000 時的輸出:
10000
30000
50000
70000
90000
110000
130000
150000
步長為 15,000 時的輸出:
10000
25000
40000
55000
70000
85000
100000
115000
130000
145000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.