0

我正在创建一个数组数组,这样:

var arrNewArray = new string[arrOldArray.Length][7];

arrOldArray 是一个数组数组,它​​是 [X][4],这意味着第一个数组或“外部”数组的长度可以改变,但“内部”数组的长度始终为 4,或包含 4 个字符串([ 0][1][2][3])。

为什么编译器不接受我上面的陈述?

本质上,我正在尝试使用 arrOldArray 并对其进行扩展,或者通过将旧数组中的 [4] 增加到新数组中的 [7] 来添加更多“列”,然后将内容复制过来。也许我没有以最好/有效的方式做到这一点,所以任何指导都将不胜感激。

4

6 回答 6

4

我想你想要一个二维数组:

var arrNewArray = new string[arrOldArray.Length, 7];

您可以像这样访问它:arrNewArray[x, y].

这比锯齿状数组要好,因为它清楚地表明每一行的“列”数是相同的。

如果你想继续使用锯齿状数组,你需要这样做:

var arrNewArray = new string[arrOldArray.Length][];
for(int i = 0; i < arrOldArray.Length; ++i)
    arrNewArray[i] = new string[7];

这种复杂方式的原因是:对于锯齿状数组,每个“行”可以有不同数量的“列”。不存在每个“行”具有相同数量“列”的情况的简写语法。这就是您的代码无法编译的原因。
锯齿状数组是必不可少的数组数组,因此您需要为外部数组的每个“行”创建一个新的数组实例并显式分配它。这就是for循环正在做的事情。

您不能Array.Copy与锯齿状数组一起使用。每个子数组都是它自己的实例,Array.Copy不会进行深层复制,它只是将引用从一个数组复制到另一个数组。效果是,两个数组都指向相同的项,并且从另一个数组中可以看到更改一个数组中的项。

于 2013-01-24T16:57:52.080 回答
2

您没有正确创建锯齿状数组。正确的方法是创建交错数组的第一个维度,然后循环遍历第一个维度的项目以创建嵌套数组并从旧数组中复制数据。这是一个例子:

int newSize = 7;
string[][] newArray = new string[oldArray.Length][];
for (int i = 0; i < oldArray.Length; i++)
{
    newArray[i] = new string[newSize];
    Array.Copy(oldArray[i], newArray[i], oldArray[i].Length);
}
于 2013-01-24T17:25:18.763 回答
1

你会想要

var arrNewArray = new string[arrOldArray.Length, 7];
于 2013-01-24T16:57:34.577 回答
0
var arrNewArray = new[] {new string[7]};//array of arrays
var arrNewArray = new string[arrOldArray.Length, 7];//two-dimensional array
于 2013-01-24T17:03:30.120 回答
0

使用 Linq:

int[][] jaggedArray2 = new int[][] 
{
    new int[] {1,3,5,7,9},
    new int[] {0,2,4,6},
    new int[] {11,22}
};
int length = jaggedArray.Sum(a => a.Length);
于 2013-01-24T17:08:15.090 回答
0

我不相信你问的是直接可能的。因为您使用的语法是针对锯齿状数组的,而您正在做的是有效地要求它创建一个多维数组。

语法令人困惑,因为它读起来就像您真正想要的是一个多维数组(尽管我知道情况并非如此。)

由于大小更改,我不相信您可以将数组存储在新分配的数组中。您需要构建一个自定义复制方法来将数据移动到更大的数组中。

于 2013-01-24T17:29:43.950 回答