SPF*_*ake 15
假设一start,end和increment值,可以摘要进一步:
Enumerable
.Repeat(start, (int)((end - start) / increment) + 1)
.Select((tr, ti) => tr + (increment * ti))
.ToList()
Run Code Online (Sandbox Code Playgroud)
让我们分解一下:
Enumerable.Repeat获取起始编号,对给定数量的元素重复,并返回可枚举(集合).在这种情况下,我们先从start元素,找到之间的差异start,并end与由划分它increment(这给了我们之间增量的数量start和end),并添加一个包含原始号码.这应该给我们使用的元素数量.请注意,由于increment是十进制/双精度,因此在转换为int时可能会出现舍入错误.
Select给定特定选择器函数,转换可枚举的所有元素.在这种情况下,我们将获取生成的数字和索引,并将原始数字与索引相乘乘以增量.
最后,调用ToList将把集合保存到内存中.
如果您经常发现自己使用此功能,那么您可以创建一个方法来为您执行此操作:
public static List<decimal> RangeIncrement(decimal start, decimal end, decimal increment)
{
return Enumerable
.Repeat(start, (int)((end - start) / increment) + 1)
.Select((tr, ti) => tr + (increment * ti))
.ToList()
}
Run Code Online (Sandbox Code Playgroud)
编辑:更改为使用重复,以便仍然保持非整数值.此外,这里没有错误检查,所以你应该确保检查increment不是0和那个start< end * sign(increment).将结尾乘以增量符号的原因是,如果您以负数递增,则结束应该在开始之前.
Tim*_*ter 11
最简单的方法是使用Enumerable.Range:
double[] result = Enumerable.Range(100, 500)
.Select(i => (double)i/100)
.ToArray();
Run Code Online (Sandbox Code Playgroud)
(因此在可读性和代码行方面有效)
我只会做一个简单的功能。
public IEnumerable<decimal> GetValues(decimal start, decimal end, decimal increment)
{
for (decimal i = start; i <= end; i += increment)
yield return i;
}
Run Code Online (Sandbox Code Playgroud)
然后你可以把它变成一个数组,查询它,或者用它做任何你想做的事情。
decimal[] result1 = GetValues(1.0m, 6.0m, .01m).ToArray();
List<decimal> result2 = GetValues(1.0m, 6.0m, .01m).ToList();
List<decimal> result3 = GetValues(1.0m, 6.0m, .01m).Where(d => d > 3 && d < 4).ToList();
Run Code Online (Sandbox Code Playgroud)