在C#中创建一个二维数组数组

问题描述:

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

所以我想要一个数组,其中每个索引返回一个二维数组,我将使用xy

这是我已经试过:

waypoints = new int[4][,] { 
     {{0},{6, 0}}, 
     {{1},{1, 1}}, 
     {{2},{1, 5}}, 
     {{3},{6, 5}} 
    }; 

我知道这可能看起来愚蠢,但我试图寻找它在谷歌,我还没有得到什么好结果。

它给出了一个错误:

"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"

+0

可能的复制[忽略锯齿阵列初始化的新c#](http://stackoverflow.com/questions/14492279/omitting-c-sharp-new-from-jagged-array-initialization) – ardila

+1

为什么不创建一个'Vector2'结构列表或类似的东西?从长远来看,使用起来可能更简单,而且更简单。 – rhughes

+1

@rhughes:更好的参考位置(当前处理器中L-n缓存的一个重要考虑因素)和减少的垃圾回收(因为*数组*是一个对象,结构不是)。 –

还有一个大括号设置{}是在初始声明中要求:

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,即:阵列,其阵列成员可以是different size的阵列),int[,]是2D阵列与fixed dimension 。两者都是存储数组的数组,因此数组的每个元素都是一个数组。这就解释了为什么需要在其初始化中加入另一个大括号。

这种2D阵列,不同的初始化时,将导致不同的尺寸(因此,有多种方式将其初始化):需要

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

在任一方式,组附加大括号的。

对于jagged array和多维的,固定大小的,阵列之间的差异,是therealreadyplentygoodexplanations/benchmarkingavailableonline从井知名来源。而且我明白除了OP的兴趣之外,这并不重要,因为我可以提供更多的信息。 (因此,这个答案的范围原本只是为了回答失败的初始化)。

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

使用2D阵列来表示在2D Cartesian coordinate单点是一个“矫枉过正”,作为一维数组是已经能够存储多达数作为计算机允许,存储点在笛卡尔多需要两个以上数坐标系。

+0

谢谢!如果你可以解释为什么这是我会很高兴:) – MysticPing

+0

我相信这是由微软在MSDN最好的解释:https://social.msdn.microsoft.com/Forums/en-US/283a69b0-169f-4178- 88ce-1b71079897a2 /差异之间的简单阵列和锯齿阵列?forum = csharplanguage PS:但是如果你想存储点,它可能是值得使用'点'类存储它' – Ian

+0

我相信'新int [,] {{6,0}}'就足够了,可以说是更具可读性 – ardila

有一个简单的答案。使用“System.Drawing.Point”类的实例。创建一个“Point”数组来存储坐标。创建阵列:

Point[] points = new Point[4]; 

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

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

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

int xvalue = points[0].X; 

int yvalue = points[0].Y; 

P.S.您可以使用这些点数分配给控件的位置,但这是另一个故事^ _^

+1

谢谢,生病了! – MysticPing

数组是二维的,有未知的大小,初始化可以定义各种大小的数组:

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