C#增量数组

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

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

假设有一个startend和一个increment值,你可以进一步抽象:

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

让我们分解一下:

Enumerable.Repeat接受一个起始编号,对给定数量的元素重复,并返回一个可枚举的(一个集合)。 在这种情况下,我们从start元素start ,找到startend之间的差异并将其除以increment (这给出了startend之间的增量数),并添加一个以包含原始数字。 这应该给我们使用的元素数量。 请注意,由于increment是十进制/双精度,因此在转换为int时可能会出现舍入错误。

给定特定选择器函数, Select转换可枚举的所有元素。 在这种情况下,我们将获取生成的数字和索引,并将原始数字与索引相乘,再加上增量。

最后,对ToList的调用将把集合保存到内存中。

如果您发现自己经常使用它,那么您可以创建一个方法来为您执行此操作:

 public static List 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 < end * sign(increment )。 将结尾乘以增量符号的原因是,如果您以负数递增,则结束应该在开始之前。

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

 double[] result = Enumerable.Range(100, 500) .Select(i => (double)i/100) .ToArray(); 

(因此在可读性和代码行方面效率很高)

我只想做一个简单的function。

  public IEnumerable 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 result2 = GetValues(1.0m, 6.0m, .01m).ToList(); List result3 = GetValues(1.0m, 6.0m, .01m).Where(d => d > 3 && d < 4).ToList(); 

使用0.01增量的for循环:

 List myList = new List(); 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 ),它们不能代表舍入行为用于这样的事情。 转到decimal或带有因子的整数。 对于后者:

 Decimal[] decs = new Decimal[500]; for (int i = 0; i < 500; i++){ decs[i] = (new Decimal(i) / 100)+1 ; } 

你可以像这样解决它。 solution方法返回一个double数组

 double[] Solution(double min, int length, double increment) { double[] arr = new double[length]; double value = min; arr[0] = value; for (int i = 1; i 
 var ia = new float[500]; //guesstimate var x = 0; for(float i =1; i <6.01; i+= 0.01){ ia[x] = i; x++; } 

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