C#增量数组

Kev*_*own 7 c# arrays optimization loops increment

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

我想要的是一个数组,mins和maxs可能会在以后更改...像这样: x[1,1.01,1.02,1.03...]

SPF*_*ake 15

假设一start,endincrement值,可以摘要进一步:

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(这给了我们之间增量的数量startend),并添加一个包含原始号码.这应该给我们使用的元素数量.请注意,由于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).将结尾乘以增量符号的原因是,如果您以负数递增,则结束应该在开始之前.

  • +1实际显示数字的来源(以及使用`decimal`). (3认同)

Tim*_*ter 11

最简单的方法是使用Enumerable.Range:

double[] result = Enumerable.Range(100, 500)
                  .Select(i => (double)i/100)
                  .ToArray();
Run Code Online (Sandbox Code Playgroud)

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

  • 好答案.一个修正:你想要的范围是Enumerable.Range(100,600). (2认同)

mdm*_*m20 5

我只会做一个简单的功能。

    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)