4

我知道我们可以通过以下两种方式之一初始化数组:

  1. 循环(无内存反射问题)
  2. Enumerable.Repeat(可能导致内存问题?链接:Enumerable.Repeat 有一些内存问题?

我有两个问题:

  1. 我们可以用Array.ForEach这种方式初始化一个数组吗?

    double[][] myarr = new double[13][];
    
    Array.ForEach(myarr, *enter_code_here*);
    

    我尝试替换enter_code_here为:

    s => s = new double[2];
    

    但它没有初始化myarr

  2. 没有任何内存问题的其他数组初始化方法是什么?

4

3 回答 3

8

您可以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();
于 2012-04-09T09:39:58.797 回答
3

A1:不,你不能。Foreach 只执行以元素为参数的方法,但不修改元素。

A2:您可以使用以下方法解决问题

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;
}
于 2012-04-09T09:33:08.827 回答
0

这就是我创建 256 行 x 2 列数组并将所有值初始化为 -1 的方式。

int[][] myArr = Enumerable.Range(0, 256).Select(i => new int[2] {-1, -1}).ToArray();

于 2014-05-22T16:02:26.007 回答