如果我想生成一个从1到6并以.01递增的数组,那么最有效的方法是什么?
我想要的是一个数组,其中的分钟和最大值可能会在以后更改......就像这样:x[1,1.01,1.02,1.03...]
答案 0 :(得分:15)
假设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
之间的增量数{1}}和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()
}
编辑:更改为使用重复,以便仍然保持非整数值。此外,此处没有错误检查,因此您应确保检查increment
是否为0且start
&lt; end * sign(increment
)。将结尾乘以增量符号的原因是,如果您以负数递增,则结束应该在开始之前。
答案 1 :(得分:11)
最简单的方法是使用Enumerable.Range
:
double[] result = Enumerable.Range(100, 500)
.Select(i => (double)i/100)
.ToArray();
(因此在可读性和代码行方面效率很高)
答案 2 :(得分:4)
我只是做一个简单的功能。
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();
答案 3 :(得分:2)
使用0.01增量的for循环:
List<decimal> myList = new List<decimal>();
for (decimal i = 1; i <= 6; i+=0.01)
{
myList.Add(i);
}
答案 4 :(得分:1)
<强>优雅强>
double[] v = Enumerable.Range(1, 600).Select(x => x * 0.01).ToArray();
<强>高效强>
Use for loop
答案 5 :(得分:0)
无论你做什么,都不要使用浮点数据类型(比如double
),他们不会代表舍入行为为这样的事情工作。转到decimal
或带有因子的整数。对于后者:
Decimal[] decs = new Decimal[500];
for (int i = 0; i < 500; i++){
decs[i] = (new Decimal(i) / 100)+1 ;
}
答案 6 :(得分:0)
你可以像这样解决它。解决方法返回一个双数组
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;
}
答案 7 :(得分:-1)
var ia = new float[500]; //guesstimate
var x = 0;
for(float i =1; i <6.01; i+= 0.01){
ia[x] = i;
x++;
}
你可以通过多线程来提高速度,但除非你计划在非常慢的处理器上运行它,否则它可能不值得开销。