如何用值优雅地填充数组/列表

时间:2018-11-23 07:27:30

标签: c# arrays

如何“以智能方式”构造一个双精度数组?我需要它填充10个这样的值,

0*

但是更喜欢这样的动态建筑

^0*10*$

与执行的相当平凡的服务相比,它看起来显得矮胖并且在我的代码中引起了太多的关注。

我可以写得更聪明吗?

BR, 安德斯

4 个答案:

答案 0 :(得分:2)

尝试Enumerable.Range

  int n = 7;
  double step = 0.05; 

  double[] d = Enumerable
    .Range(-n / 2, n)
    .Select(i => i * step)
    .ToArray();

  Console.Write(string.Join("; ", d));

结果

-0.15; -0.1; -0.05; 0; 0.05; 0.1; 0.15

如果n = 3,我们会得到

-0.05; 0; 0.05

答案 1 :(得分:2)

这一切取决于您所谓的“智能方式”。性能?可读性?维护?

一方面,如果您只有三个元素并且值是静态的,那么您的第一行代码就很好,这就是“最聪明的方式”。 (如果您需要列表)会有一个小的改进:

List<double> d = new List<double> { -0.05, 0, 0.05 };

另一方面,如果您有很多值,则for循环可能更容易编写。

Linq也有可能,所以可以这样写:

List<double> d = Enumerable.Range(-1,3).Select(x => x * 0.05).ToList();

真的很不错,因为您正在使用Linq且它摇摆不定,但它确实更具可读性吗?表现更好?更聪明?

总而言之,这完全取决于您想要什么和需要做什么。您的问题没有直接答案。

答案 2 :(得分:0)

您可以使用linq,不确定它是否很聪明:

double start = -0.05;
double step = 0.05;
var result = Enumerable.Repeat(0, 3).Select((x, i) =>start+step*i).ToArray();

答案 3 :(得分:0)

另一种方法是,如果要初始化很多数组,则可能需要在帮助器类中使用IEnumerableyield

public static IEnumerable<double> RangeEx(double start, double finish, double step)
{
    for (var dd = start; dd < finish; dd += step) 
        yield return dd;
}

用法

var array = RangeEx(-0.05, 0.05, 0.05).ToArray();