C# 初始化数组中的几个特定值时,请将rest设置为默认值

C# 初始化数组中的几个特定值时,请将rest设置为默认值,c#,arrays,initialization,C#,Arrays,Initialization,是否有一种方法可以声明一个包含60个值的数组,如下所示(少数特定值,其余值将在稍后计算): 而不是为了这样的事情浪费两条线: long[] l = new long[60]; l[0] = 1; l[1] = 2; 您可以初始化完整数组(这将为所有元素提供默认值),然后使用array.Copy仅从固定的较短数组填充部分数组: int[] arr = new int[60]; Array.Copy(new[] {1, 2, 3}, arr, 3); 一种更奢侈(和浪费)的方法是使用LINQ:

是否有一种方法可以声明一个包含60个值的数组,如下所示(少数特定值,其余值将在稍后计算):

而不是为了这样的事情浪费两条线:

long[] l = new long[60];
l[0] = 1;
l[1] = 2;

您可以初始化完整数组(这将为所有元素提供默认值),然后使用
array.Copy
仅从固定的较短数组填充部分数组:

int[] arr = new int[60];
Array.Copy(new[] {1, 2, 3}, arr, 3);
一种更奢侈(和浪费)的方法是使用LINQ:

int[] arr = new[] {1, 2, 3}.Concat(Enumerable.Repeat(0, 57)).ToArray();
基于
Array
API还有另一种有趣的方法,那就是调整小数组的大小以适应大数组。此过程将为所有新元素指定默认值:

int[] arr = new[] {1, 2, 3};
Array.Resize(ref arr, 60);

如果坚持单行初始化,可以使用C#集合初始值设定项语法构造
列表
,然后将该列表转换为数组:

long[] data = new List<long>(new long[60]) {[0]=1, [1]=2}.ToArray();
long[]data=new List(new long[60]){[0]=1[1]=2}.ToArray();

不幸的是,新的C#indexer初始化不适用于数组,因此这种方法仍然效率低下。但是,当您谈论大小为60或甚至600个元素的阵列时,这种效率低下是无法检测到的,因为创建和处理一次性60个元素的阵列将是时间测量的“噪音”。

为什么它更浪费?你能解释一下吗?因为
ToArray()
将使用
GetEnumerator()
+
MoveNext()
60次,更不用说它必须遍历序列两次才能将其转换为数组,因为它首先必须知道序列的长度,以及用
Concat()构造的序列
无法有效地说出这一点<代码>数组。同时,Copy,可以预先知道所有内容,如果运气好的话,它在编译时会生成一条CPU指令。我刚刚测量了它,第一个变体在60项数组上的速度快了4倍。在1000项数组中,第一个变体的速度快17倍。
long[] data = new List<long>(new long[60]) {[0]=1, [1]=2}.ToArray();