C#增量数组

时间:2012-05-23 13:43:58

标签: c# arrays optimization loops increment

如果我想生成一个从1到6并以.01递增的数组,那么最有效的方法是什么?

我想要的是一个数组,其中的分钟和最大值可能会在以后更改......就像这样:x[1,1.01,1.02,1.03...]

8 个答案:

答案 0 :(得分:15)

假设startendincrement值,您可以进一步抽象:

Enumerable
    .Repeat(start, (int)((end - start) / increment) + 1)
    .Select((tr, ti) => tr + (increment * ti))
    .ToList()

让我们分解一下:

Enumerable.Repeat获取一个起始编号,对给定数量的元素重复,并返回一个可枚举(一个集合)。在这种情况下,我们从start元素开始,找到startend之间的差异,并将其除以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++;
}

你可以通过多线程来提高速度,但除非你计划在非常慢的处理器上运行它,否则它可能不值得开销。