在C#中创建二维数组的数组

Creating an array of two-dimensional arrays in C#

我只是想创建一个二维数组的数组来存储坐标点。

所以我想要一个数组,其中每个索引 returns 一个二维数组,我将用作 xy.

这是我试过的方法:

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[][](称为jagged array,即:array of arrays,其数组成员可以是different size), int[,] is a 2D array with fixed dimension。两者都是存储数组的数组,因此数组的每个元素都是一个数组。这就解释了为什么需要在上面的初始化中放置另一个花括号。

这样的二维数组,当初始化不同时,会产生不同的维度(因此有多种初始化方法):

int[,] val = new int[,] { { 6 }, { 0 } }; //resulting in int[2,1]
int[,] val = new int[,] { { 6, 0 } }; //resulting in int[1,2]

无论哪种方式,都需要额外的一组大括号

关于 jagged array 和多维、固定大小的数组 there are already plenty good explanations/benchmarking available online 之间的差异,来自知名来源。而且我知道,除了 OP 的兴趣之外,我提供更多有关它的信息并不重要。 (因此,此答案的范围最初仅针对初始化失败的答案)。

据了解,该解决方案不是最好用于存储坐标点(如 OP 所做的那样)。上面的解释是为了解释为什么他的初始化不起作用,而不是提供存储坐标点的最佳方案。至于存储坐标点,System.Drawing struct中的Point会更合适(如评论中所建议)。

使用二维数组表示二维中的单个点 Cartesian coordinate 是一个 "overkill",因为一维数组已经能够存储计算机允许的尽可能多的数字,远远超过两个在笛卡尔坐标系中存储点所需的数字。

对此有一个简单的答案。使用 "System.Drawing.Point" class 的实例。创建一个 "Point" 数组来存储坐标。创建数组:

Point[] points = new Point[4];

并为数组赋值(例如,在位置 0)使用以下代码。

points[0] = new Point(xvalue,yvalue);//Where "xvalue" and "yvalue" are integer variables.

并从点 class 的实例中获取 X 和 Y 值。使用以下代码。

int xvalue = points[0].X;

int yvalue = points[0].Y;

P.S。您可以使用这些点将位置分配给控件,但这是另一回事^_^

数组为two-dimensional且大小未知,初始化程序可以定义各种大小的数组:

        var waypoints = new int[4][,]   {
                new int[,] { {1, 2, 6}, {3, 4, 5} }, // two rows, 3 columns
                new int[,] { {1, 1}, {1, 2} } , // 2 x 2
                new int[,] { {1, 5} }, // 1 x 2
                new int[,] { {6, 5} }
                };

我可能误解了这个问题,但是你在数组中的维度是不是太过分了?这与那些建议使用点或向量 class 的人的观点有点相同。如果每个数组只存储一个点(它可能不是,我可能只是假设),则不需要 3 个维度。您可以有一个常规数组数组,并使用索引 0 作为 x 坐标,使用索引 1 作为 y 坐标。

在我看来,您正在创建一个完整的第 3 维,其中每个数组的大小为 1,将其可视化为二维数组会简单得多。虽然看起来您将数组用作一种键值对,但索引本身可以用作键吗?无论如何,它们似乎每次都在增加。