繁体   English   中英

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

[英]Determining size of an array of arrays in C#?

我正在创建这样的数组数组:

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

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

编译器为什么不接受我的上述声明?

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

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

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并不进行深拷贝,它只是将引用从一个数组复制到另一个数组。 效果是,两个数组都指向相同的项目,而从另一个数组中看到一个项目中的更改项目。

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

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);
}

你会想要

var arrNewArray = new string[arrOldArray.Length, 7];
var arrNewArray = new[] {new string[7]};//array of arrays
var arrNewArray = new string[arrOldArray.Length, 7];//two-dimensional array

使用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);

我不认为您的要求是直接可能的。 因为您使用的语法是针对锯齿状数组的,所以您实际上在要求它创建多维数组。

语法令人困惑,因为它看起来像您真正想要的是多维数组(尽管我知道不是这种情况。)

我不相信由于大小的变化,您也不能将数组存储在新分配的数组中。 您将需要构建一个自定义复制方法,以将数据移入更大的数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM