如果我想生成一个从1到6,每次增加0.01的数组,最有效的方法是什么?
我想要一个数组,mins和maxs稍后可能会更改...就像这样:
我想要一个数组,mins和maxs稍后可能会更改...就像这样:
x [1,1.01,1.02,1.03 ...]
x [1,1.01,1.02,1.03 ...]
start
,结束值end
和步长increment
,你可以进一步抽象化这个概念:Enumerable
.Repeat(start, (int)((end - start) / increment) + 1)
.Select((tr, ti) => tr + (increment * ti))
.ToList()
让我们分解一下:
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()
}
编辑:改用 Repeat,以便非整数值仍将保留。此外,此处未执行错误检查,因此应确保检查 increment
不为 0,并且 start
< end * sign(increment)
。将 end 乘以增量符号的原因是,如果您正在按负数增加,则结束应该在开始之前。
decimal
库,我为此点赞。(原文已被成功翻译) - George DuckettEnumerable.Range
函数:double[] result = Enumerable.Range(100, 500)
.Select(i => (double)i/100)
.ToArray();
(因此在可读性和代码行数方面更加高效)
Range(100, 600)
是从1到7的范围。请注意,上面排除了 6.00
,如果需要,请取501。 - Tim Schmelter public IEnumerable<decimal> GetValues(decimal start, decimal end, decimal increment)
{
for (decimal i = start; i <= end; i += increment)
yield return i;
}
然后你可以将其转换为数组,查询它或者对其进行任何操作。
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();
使用for循环并以0.01为增量:
List<decimal> myList = new List<decimal>();
for (decimal i = 1; i <= 6; i+=0.01)
{
myList.Add(i);
}
优雅
double[] v = Enumerable.Range(1, 600).Select(x => x * 0.01).ToArray();
高效
Use for loop
double[] Solution(double min, int length, double increment)
{
double[] arr = new double[length];
double value = min;
arr[0] = value;
for (int i = 1; i<length; i++)
{
value += increment;
arr[i] = value;
}
return arr;
}
double
),因为它们在处理舍入行为等方面不适用于此类事情。选择使用decimal
或带有因子的整数。对于后者:Decimal[] decs = new Decimal[500];
for (int i = 0; i < 500; i++){
decs[i] = (new Decimal(i) / 100)+1 ;
}
var ia = new float[500]; //guesstimate
var x = 0;
for(float i =1; i <6.01; i+= 0.01){
ia[x] = i;
x++;
}
你可以使用多线程来提高速度,但除非你计划在一个非常慢的处理器上运行此程序,否则这可能不值得开销。
ia
,对吗?这不是作用域问题吗? - Kevin Brown