在C#中创建一个二维数组数组
我只是想创建一个二维数组的数组来存储坐标点。在C#中创建一个二维数组数组
所以我想要一个数组,其中每个索引返回一个二维数组,我将使用x
和y
。
这是我已经试过:
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"
还有一个大括号设置{}
是在初始声明中要求:
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.Drawing
struct
中的Point会更合适(如评论中所建议的那样)。
使用2D阵列来表示在2D Cartesian coordinate单点是一个“矫枉过正”,作为一维数组是已经能够存储多达数作为计算机允许,存储点在笛卡尔多需要两个以上数坐标系。
谢谢!如果你可以解释为什么这是我会很高兴:) – MysticPing
我相信这是由微软在MSDN最好的解释:https://social.msdn.microsoft.com/Forums/en-US/283a69b0-169f-4178- 88ce-1b71079897a2 /差异之间的简单阵列和锯齿阵列?forum = csharplanguage PS:但是如果你想存储点,它可能是值得使用'点'类存储它' – Ian
我相信'新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.您可以使用这些点数分配给控件的位置,但这是另一个故事^ _^
谢谢,生病了! – 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} }
};
可能的复制[忽略锯齿阵列初始化的新c#](http://stackoverflow.com/questions/14492279/omitting-c-sharp-new-from-jagged-array-initialization) – ardila
为什么不创建一个'Vector2'结构列表或类似的东西?从长远来看,使用起来可能更简单,而且更简单。 – rhughes
@rhughes:更好的参考位置(当前处理器中L-n缓存的一个重要考虑因素)和减少的垃圾回收(因为*数组*是一个对象,结构不是)。 –