我知道我们可以通过以下两种方式之一初始化数组:
- 循环(无内存反射问题)
-
Enumerable.Repeat
(可能导致内存问题?链接:可枚举。重复有一些内存问题?
我有两个问题:
-
我们可以使用
Array.ForEach
以这种方式初始化数组吗?double[][] myarr = new double[13][]; Array.ForEach(myarr, *enter_code_here*);
我尝试将
enter_code_here
替换为:s => s = new double[2];
但它不会初始化
myarr
. -
没有任何内存问题的其他阵列初始化方法是什么?
你可以使用Enumerable.Repeat
来初始化任何数组。您唯一需要注意的是,如果数组元素是引用类型,则有两种方法可以处理它:
// #1: THIS ARRAY CONTAINS 10 REFERENCES TO THE SAME OBJECT
var myarr = Enumerable.Repeat(new object(), 10).ToArray();
// #2: THIS ARRAY CONTAINS REFERENCES TO 10 DIFFERENT OBJECTS
var myarr = Enumerable.Range(0, 10).Select(i => new object()).ToArray();
// #3: SAME RESULT AS #2 BUT WITH Enumerable.Repeat
var myarr = Enumerable.Repeat(0, 10).Select(i => new object()).ToArray();
A1:不,你不能。Foreach 只执行以元素作为参数的方法,但不修改元素。
答2:您可以使用以下方法解决问题
static T[][] CreateArray<T>(int rows, int cols)
{
T[][] array = new T[rows][];
for (int i = 0; i < array.GetLength(0); i++)
array[i] = new T[cols];
return array;
}
这就是我创建一个 256 行 x 2 列数组并将所有值初始化为 -1 的方式。
int[][] myArr = Enumerable.Range(0, 256).Select(i => new int[2] {-1, -1}).ToArray();