一、多维数组
除一维数组外,还支持二维数组、三维数组等多维数组。
一维数组由排列在一行中的所有元素组成,它只有一个索引。
二维数组有两个索引(从零开始)。
其中一个表示行,一个表示列,从概念上讲,二维数组就像一个具有行和列的表格。
例如,声明创建了一个3行2列的二维数组。
int[,] arr = new int[3,2];
第一行 arr[0,0] arr[0,1]
第二行 arr[1,0] arr[1,1]
第三行 arr[2,0] arr[2,1]
二维数组赋值的表示:
arr[2,1]=10; //把第3行的第2列元素赋值为10
例如,声明创建一个三维数组
int[,,] arr = new int[4,2,3]; //可以理解成x,y,z的坐标,确认一个值。
x坐标为4,y坐标为2,z坐标为3。
二、多维数组的初始化(也就是定义一个多维数组。)
以二维数组为例,可以声明数组时将其初始化
例:
int[,] number = new int[3,2] { {1,2}, {3,4}, {5,6} };
string[,] names = new string[2, 2] { {"A1","A2"}, {"B1","B2"}};
可以省略数组大小
例:
int[,] number = new int[,] { {1,2}, {3,4}, {5,6} };
string[,] names = new string[,] { {"A1","A2"}, {"B1","B2"}};
再省略new运算符
例
int[,] number = {{1, 2}, {3, 4}, {5,6}};
string[,] names = {{"A1","A2"},{"B1",B2}};
三、多维数组的操作(也就是调用数组)
以二维数组为例,表达引用方式为:
数组名[下标表达式1,下标表达式2];
多维数组的引用方式为:
数组名[下标表达式1,下标表达式2,。。。,下标表达式n];
与一维数组相同,多维数组元素的下标也是从0号开始编号。
另外数组的秩(数组的维度)存放在属性Rank中,每一维的长度可以通过GetLength方法得到。
维度的最小下标值始终是0,最大下标值是由该维的GetUpperBound方法返回的。
注意传递给GetLength和GetUpperBound的参数是从0开始计数的。
1.例
arr.GetLength(0); //返回数组arr的第一维的长度
arr.GetLength(1); //返回数组arr的第二维的长度
arr.GetUpperBound(0); //返回第一维数组的最大下标值
arr.GetUpperBound(1); //返回第一维数组的最大下标值
注意
arr.GetUpperBound(0); 相当于 arr.GetLength(0)-1;
arr.GetUpperBound(1); 相当于 arr.GetLength(1)-1;
也就是坐标的值,并非坐标内的实际数值。
从数值的Length属性可以获得数组的总元素数量。
堆一维数组的Length和GetLength(0)方法的返回值相同。
2.例,示例代码
运行结果
3.例,看一个4行2列(4*2)的整型二维数组的遍历。
运行结果
4.也可以通过foreach循环遍历二维数组
运行结果:
四、数组示例
通过编写一个小游戏来演示如何灵活地使用数组。
1.拼数字游戏
1)创建Windows应用程序
2)修改窗体的属性,Name:MainForm;Text:拼数字游戏;
3)在窗体上放置Button按钮控件,Name:btnPlay;Text:开始游戏。
4)放置一个Panel控件,Size:240,240;BackColor:Silver;
Panel控件,属于画板容器?容易覆盖之前的控件。
5)放置9个Label控件,从全部选中,修改属性:
AutoSize:false;
BorderStyle:FixedSingle;
BackColor:Coral;
TextAlign:MiddleCenter;
Size:80,80;
Font:宋体,初号字;
6)然后分别把Label控件的Text属性,1,2,3,4,5,6,7,8,9
7)定义Label控件的Localtion属性。
控件名称 Localtion
Label1 0,0
Label2 80,0
Label3 160,0
Label4 0,80
Label5 80,80
Label6 160,80
Label7 0,160
Label8 80,160
Label9 160,160
如图
8)双击btnPlay按钮控件,写入代码
10)选中所有的Label控件,并在事件中点击Click事件。(也就是将九个控件,公用一个代码块。)
运行结果
代码分析
数组的一个最大优点是它的元素可以成为任何对象,甚至是窗体控件。
本例中,9个Label控件放在一个3*3的二维数组之内,正好可以表示一个3*3矩阵。
这样可以很方便地判断是否单击了与空白方块相邻的数字。
20~22行
常见一个用于存放Label控件的二维数组。
Label[,] arrLbl = new Label[3, 3];
记录不可见Label控件的坐标,也就是消失的那个
int unRow = 0, unCol = 0;
判断是否正在游戏中
bool playing = false;
27~35行
将9个Label控件装入二维数组。
就是把9个Label控件存到一个二维数组里,以便后面的操作。
36行
为了防止单击两次“开始按钮”;
Visibel属性,表示显示或隐藏指定的模块。
37~45行
如何快速生成一组指定范围的没有重复的随机数。
它的原理是先生成0~8之间的随机数,然后找到这个随机数的下标元素,并让它与第i个元素进行交换。
(也就是随机把数组arrNum重新排列)
46~49行
演示了如何用单层for循环的顺序,遍历二维数组。
50~53行
随机生成一个数,然后转化成二维数组的坐标,并让它不可见。
63~64行
计算标签的行下标和列下标。
(也就是算出你点击的那个标签的坐标,除以80是因为每个label控件的长宽是80一个单位。)
65~74行
判断被单击的方块是不是跟空白方块相连。
因为相互移动不是上下移动,就是左右移动,所以有可能是行相同,或者列相同,不相同的差值,不是1就是-1,所以通过Math.Abs()绝对值函数,就能跟1进行比较,确定是否进行标签互换,并把改变的隐藏Label控件重新赋值给隐藏的控件坐标。
80~86行
先遍历判断123456789是否被放置在该有的位置,如果没有,就直接结束循环。
如果全部符合,就是i==8后,显示被隐藏的数字Label控件,结束游戏标志,弹出消息框。