我正在创建一个数组数组,以便:
var arrNewArray = new string[arrOldArray.Length][7];
arrOldArray是一个数组数组,它是[X] [4],这意味着第一个数组或“外部”数组的长度可以改变,但“内部”数组的长度总是4,或者保持4字符串([0] [1] [2] [3])。
为什么编译器不接受我上面的陈述?
基本上,我正在尝试使用arrOldArray并扩展它,或者通过将旧数组中的[4]增加到新数组中的[7]并添加内容来添加更多“列”。也许我不是最好/最有效的方式,所以任何指导都将不胜感激。
答案 0 :(得分: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
不会生成深层副本,它只是将引用从一个数组复制到另一个数组。结果是,两个数组都指向相同的项目,并且可以从另一个数组中看到更改一个数组中的项目。
答案 1 :(得分: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);
}
答案 2 :(得分:1)
你会想要
var arrNewArray = new string[arrOldArray.Length, 7];
答案 3 :(得分:0)
var arrNewArray = new[] {new string[7]};//array of arrays
var arrNewArray = new string[arrOldArray.Length, 7];//two-dimensional array
答案 4 :(得分: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);
答案 5 :(得分:0)
我不相信你所要求的是直接可能的。因为您使用的语法是针对锯齿状数组,所以您正在做的是有效地要求它创建一个多维数组。
语法令人困惑,因为它读起来就像你真正想要的是一个多维数组(虽然我知道情况并非如此。)
我不相信您可以将数组存储在新分配的数组中,原因是尺寸发生了变化。您需要构建自定义复制方法以将数据移动到更大的数组中。