如何“以智能方式”构造一个双精度数组?我需要它填充10个这样的值,
0*
但是更喜欢这样的动态建筑
^0*10*$
与执行的相当平凡的服务相比,它看起来显得矮胖并且在我的代码中引起了太多的关注。
我可以写得更聪明吗?
BR, 安德斯
答案 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)
另一种方法是,如果要初始化很多数组,则可能需要在帮助器类中使用IEnumerable
和yield
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();