在C#中确定数组数组的大小?

时间:2013-01-24 16:55:52

标签: c# visual-studio-2012

我正在创建一个数组数组,以便:

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

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

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

基本上,我正在尝试使用arrOldArray并扩展它,或者通过将旧数组中的[4]增加到新数组中的[7]并添加内容来添加更多“列”。也许我不是最好/最有效的方式,所以任何指导都将不胜感激。

6 个答案:

答案 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)

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

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

我不相信您可以将数组存储在新分配的数组中,原因是尺寸发生了变化。您需要构建自定义复制方法以将数据移动到更大的数组中。