我只是想创建一个二维数组的数组来存储坐标点。
所以我想要一个数组,其中每个索引返回一个二维数组,我将其用作 x
和 y
。
这是我尝试过的:
waypoints = new int[4][,] {
{{0},{6, 0}},
{{1},{1, 1}},
{{2},{1, 5}},
{{3},{6, 5}}
};
我意识到这可能看起来很愚蠢,但我已经尝试在 Google 上查找它,但没有得到任何好的结果。
报错:
"error CS0623: Array initializers can only be used in a variable or field initializer. Try using a new expression instead "
我也试过这样做:
waypoints = new int[4][,] {
new int[,] {6, 0},
new int[,] {1, 1},
new int[,] {1, 5},
new int[,] {6, 5}
};
这给出了一个错误:
"error CS0846: A nested array initializer was expected"
最佳答案
在初始声明中需要一个大括号集 {}
:
var waypoints = new int[4][,] {
new int[,] {{6}, {0}},
new int[,] {{1}, {1}},
new int[,] {{1}, {5}},
new int[,] {{6}, {5}}
};
这是因为对于这样的二维数组,数组中的每个元素都被视为用于初始化的数组(尽管它通常用于数组的每个元素,例如 val[0,0] = 4;
)。
编辑(根据评论反馈):
与int[][]
(称为交错数组
,即:数组成员可以是different size的数组数组)对比,int[,]
是一个带有 fixed dimension 的二维数组.两者都是存储数组的数组,因此数组的每个元素都是一个数组。这就解释了为什么需要在上面的初始化中放置另一个大括号。
这样的二维数组,当初始化不同时,会产生不同的维度(因此有多种初始化方法):
int[,] val = new int[,] { { 6 }, { 0 } }; //resulting in int[2,1]
int[,] val = new int[,] { { 6, 0 } }; //resulting in int[1,2]
无论哪种方式,都需要额外的一组大括号。
关于交错数组
和多维固定大小数组之间的区别,there是already plenty good explanations/benchmarking available online来自知名人士。而且我知道,除了 OP 的兴趣之外,我提供更多有关它的信息并不重要。 (因此,此答案的范围最初仅用于回答失败的初始化)。
据了解,该解决方案不适用于存储坐标点(如 OP 所做的那样)。上面的解释是为了解释为什么他的初始化不起作用,而不是提供存储坐标点的最佳方案。至于存储坐标点,Point在 System.Drawing
struct
中会更合适(如评论中所建议)。
使用二维数组表示二维中的单点Cartesian coordinate这是一种“矫枉过正”,因为一维数组已经能够存储计算机允许的尽可能多的数字,远远超过在笛卡尔坐标系中存储点所需的两个数字。
关于c# - 在C#中创建二维数组的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34851509/