.net 遍历数组找重复值写入一个新数组_【自学C#】I 书 071 数组,多维数组、动态数组...

67f728f405a8a99357d83e7d0e4debaa.png

一、多维数组

    除一维数组外,还支持二维数组、三维数组等多维数组。

    一维数组由排列在一行中的所有元素组成,它只有一个索引。

    二维数组有两个索引(从零开始)。

    其中一个表示行,一个表示列,从概念上讲,二维数组就像一个具有行和列的表格。

    例如,声明创建了一个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.例,示例代码

60fb0b000920a3545aaff77e786680ca.png

运行结果

38e59ffdbd80463d72e6d34e51d16f29.png

    3.例,看一个4行2列(4*2)的整型二维数组的遍历。

e3873b0fbc5e0c8374f93bae412163a9.png

运行结果

89a7490d817fc6ee96db0ae532cf8b6e.png

    4.也可以通过foreach循环遍历二维数组

8c7a058222e77ab0d5f504123c57f1bb.png

运行结果:

f9e6a2e15d5c3102f99e48b15ee18eb0.png

四、数组示例

    通过编写一个小游戏来演示如何灵活地使用数组。

    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

如图

faa3152f65faa7d677cb6122de1d79a8.png

        8)双击btnPlay按钮控件,写入代码

e8e9e094a497b8edf0145503f6cecf28.png

        10)选中所有的Label控件,并在事件中点击Click事件。(也就是将九个控件,公用一个代码块。)

e4a5b722ca4f5f2e58690c851b2bee22.png

运行结果

910244206db12dfb764d95dc812380be.png

代码分析

    数组的一个最大优点是它的元素可以成为任何对象,甚至是窗体控件。

    本例中,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控件,结束游戏标志,弹出消息框。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值