C#增量数组

C#增量数组,c#,arrays,optimization,loops,increment,C#,Arrays,Optimization,Loops,Increment,如果我想生成一个从1到6递增0.01的数组,最有效的方法是什么 我想要的是一个数组,mins和maxs可能会在以后更改……比如:x[1,1.01,1.02,1.03…]无论您做什么,都不要使用浮点数据类型(比如double),它们不适用于代表舍入行为的类似情况。选择一个十进制,或一个带因子的整数。对于后者: Decimal[] decs = new Decimal[500]; for (int i = 0; i < 500; i++){ decs[i] = (new Decimal(i

如果我想生成一个从1到6递增0.01的数组,最有效的方法是什么


我想要的是一个数组,mins和maxs可能会在以后更改……比如:
x[1,1.01,1.02,1.03…]
无论您做什么,都不要使用浮点数据类型(比如
double
),它们不适用于代表舍入行为的类似情况。选择一个
十进制
,或一个带因子的整数。对于后者:

Decimal[] decs = new Decimal[500];
for (int i = 0; i < 500; i++){
  decs[i] = (new Decimal(i) / 100)+1 ;
}
Decimal[]decs=新的十进制[500];
对于(int i=0;i<500;i++){
decs[i]=(新的十进制数(i)/100)+1;
}
最简单的方法是使用:

(因此在可读性和代码行方面是有效的)

var ia=new float[500]//猜测
var x=0;

对于(浮点i=1;i使用0.01增量的for循环:

List<decimal> myList = new List<decimal>();

for (decimal i = 1; i <= 6; i+=0.01)
{
  myList.Add(i);
}
List myList=new List();

对于(十进制i=1;i假设
开始
结束
增量
值,可以进一步抽象:

Enumerable
    .Repeat(start, (int)((end - start) / increment) + 1)
    .Select((tr, ti) => tr + (increment * ti))
    .ToList()
让我们把它分解一下:

Enumerable.Repeat
获取一个起始编号,对给定数量的元素重复,并返回一个可枚举(集合)。在这种情况下,我们从
start
元素开始,找出
start
end
之间的差异,并将其除以
增量
(这为我们提供了
开始
结束
之间的增量数量)并添加一个以包括原始数字。这应该为我们提供要使用的元素数量。请注意,由于
增量
是十进制/双精度,当您转换为整数时可能会出现舍入错误

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()
}
公共静态列表范围增量(十进制开始、十进制结束、十进制增量)
{
返回可枚举
.重复(开始,(内部)((结束-开始)/增量)+1)
.选择((tr,ti)=>tr+(增量*ti))
托利斯先生()
}

编辑:更改为使用重复,这样非整数值仍将保留。此外,此处没有进行错误检查,因此您应该确保检查
增量
不是0,并且
开始
结束*符号(增量
)。将end乘以递增符号的原因是,如果您用负数递增,end应该在start之前。

double[] v = Enumerable.Range(1, 600).Select(x => x * 0.01).ToArray();
Use for loop
高效

double[] v = Enumerable.Range(1, 600).Select(x => x * 0.01).ToArray();
Use for loop

我只是做一个简单的函数

    public IEnumerable<decimal> GetValues(decimal start, decimal end, decimal increment)
    {
        for (decimal i = start; i <= end; i += increment)
            yield return i;
    }
public IEnumerable GetValues(十进制开始、十进制结束、十进制增量)
{
对于(十进制i=start;id>3&&d<4)。ToList();

您可以这样求解。solution方法返回一个双数组

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[]解决方案(双最小值、整数长度、双增量)
{
double[]arr=新的双精度[长度];
双值=最小值;
arr[0]=值;

对于(int i=1;i将如何使用十进制值的循环?定义有效的…最少编码?或最快的?将数组中的值增加0.01?或将数组大小增加1?如果是最快的,则硬编码它(假设最小/最大/增量不变).但是我不能在循环外访问
ia
,可以吗?这不是一个范围问题吗?我不明白你的意思,ia不是在循环内定义的,因此它的范围不限于循环内首先:这不适合该数组。其次,隐式缩小转换不起作用,你需要I+=0.01F,第三,你需要I’我将从1.52开始得到舍入错误。我不同意“无论你做什么,都不要使用浮点数据类型”我要的是更传统的浮点“二进制浮点”定义;)回答得好。一个更正:你想要的范围是可枚举的。范围(100600)。您可能应该以开始、结束和增量为基础计算所有数字,而不是先计算所有数字,然后在代码中插入幻数。@jdmcnair:Corrected,尽管您的
范围(100600)
的范围从1到7。请注意,如果需要,上面排除了
6.00
,需要501。如果用户希望以非整数开始,会发生什么情况?即:0.01到0.5,使用0.002增量?如果除以100而不是乘以0.01,则不需要调用Math.Round().1,用于实际显示数字的来源(以及使用
decimal
)。我最喜欢这种解决方案,因为与使用LINQ相比,它简单且开销非常小(不必枚举集合两次,首先是使用Range/Repeat构建枚举表,其次是Select函数)。
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;
}