VSTO开发入门教程
上QQ阅读APP看书,第一时间看更新

2.5 使用数组

声明一个变量,只能容纳一个数据,如果有相同类型的多个数据,可以使用数组来提高编程效率。

■2.5.1 数组的声明和初始化

数组的声明与变量的声明非常相似,声明一个整型变量的语法格式为:

    int i;

那么声明一个整型数组的语法格式为:

    int[] arr;

可以看出声明数组时,只需要在数据类型后加一对中括号即可。

声明数组的时候,也可以像变量一样,直接赋值。

    1             int[] n1 = new int[10];
    2             int[] n2 =new int[10]{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    3             int[] n3 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

上述代码,声明了三个整型数组,其中数组n1只声明而没有赋给任何值;n2和n3在声明的同时,完成数组的初始化。

如果要为数组n1赋值,可以通过下标,逐个赋值,例如n1[2]=3。

■2.5.2 一维数组

下面以计算1~10之间的奇数和为例,说明一维数组的用法。

    1             int[] a= { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    2             int total = a[0] + a[2] + a[4] + a[6] + a[8];

上述代码中,第1行声明了一个具有10个元素的整型数组,第2行代码累加数组a的5个元素。C#数组的下标是从0开始的,因此上述代码相当于累加1+3+5+7+9,最后变量total返回25。

注意 C#数组的下标是从0开始的。

■2.5.3 数组元素的遍历

还是以上面的数字加和问题为例,说明如何使用循环处理数组。

    1         public void Sum()
    2         {
    3             int[] n = new int[10];
    4             for (int i = 0; i < n.Length; i++)
    5             {
    6                 n[i] = i + 1;
    7             }
    8             int total = 0;
    9             for (int i = 0; i < n.Length; i = i + 2)
    10            {
    11                total += n[i];
    12            }
    13            MessageBox.Show(total.ToString());
    14        }

上述代码中,第4行到第7行,使用for循环为数组n赋初值。第8行把总和变量total初始化为0,第9行到第12行这个for循环体,步长为2,访问数组n中的奇数,累加给total,最后返回25。

代码中n.Length表示数组的长度,也就是指数组中元素个数。

为了加深对数组的理解和认识,再举一个用数组处理斐波那契数列的问题。

斐波那契数列是数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子引入的有趣数列,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、…,可以看出该数列前两项固定为0和1,从第三项起,每一项均等于该项前面两项之和。

在数学上,斐波纳契数列以递归的方法定义:F(0)=0, F(1)=1, F(n)=F(n1)+F(n-2)(n≥2, n∈N*)。

因此可以使用C#中的数组打印出斐波那契数列的前20项:

    1         public void Fibonacci()
    2         {
    3             int[] F = new int[20];
    4             F[0] = 0;
    5             F[1] = 1;
    6             for (int i = 2; i < F.Length; i++)
    7             {
    8                 F[i] = F[i -2] + F[i -1];
    9             }
    10            string result = "";
    11            for (int i = 0; i < F.Length; i++)
    12            {
    13                result +=  F[i].ToString()+ " ";
    14            }
    15            this.richTextBox1.Text =result;
    16        }

上述代码中,第4行到第9行为数组F赋值,第11到第14行再次使用for循环遍历斐波那契数组各个元素,并且把每一个元素追加到result之后,最后在富文本框中显示如下内容:0 1 1 2 3 5 8 13 21 34 55 89144 233377 610987 159725844181

以下代码是典型的用于处理数组的示例,读者自行调试体会。

    1         public void一维数组()
    2         {
    3             string[] arr = { "ab", "cd" };
    4             int[] a = new int[3];
    5             a[0] = 3; a[1] = 4; a[2] = 5;
    6             result = arr[0] + arr[1];
    7             foreach (var v in a)//遍历数组元素
    8             {
    9                 result += v.ToString();
    10            }
    11        }

具有同样功能的VBA代码如下:

    1  Public Sub一维数组()
    2     Dim arr(0 To 1) As String
    3     arr(0) = "ab": arr(1) = "cd"
    4     Dim a(0 To 2) As Integer
    5     Dim v
    6     a(0) = 3: a(1) = 4: a(2) = 5
    7     result = arr(0) + arr(1)
    8     For Each v In a    '遍历数组元素
    9         result = result & v
    10     Next v
    11 End Sub

■2.5.4 二维数组

二维数组用来存储二维方阵数据,比如存储中国各省的省会城市,省的简称等信息。

    1         public void province()
    2         {
    3             string[, ] p = new string[5, 3] { { "河北省", "冀", "石家庄" }, { "河
    南省", "豫", "郑州" }, { "湖北省", "鄂", "武汉" }, { "湖南省", "湘", "长沙" }, { "江苏
    省", "苏", "南京" } };
    4             for (int r = 0; r < 5; r++)
    5             {
    6                 MessageBox.Show(p[r, 0] + p[r, 2]);
    7             }
    8         }

上述代码中,第3行声明了一个字符串二维数组p,并且把5个省的信息作为初值赋给p。数组p的第一维长度是5,表示存储了5个省的信息;第二维的长度是3,表示存储每个省的省名称、省简称和省会城市名。

第4行到第6行遍历每一个省,并把省名称和省会城市名在对话框中显示。

多维数组元素的表示,还是使用一个中括号,里面每一维的下标用半角逗号隔开,比如代码中的p[r,0]表示第r个省的省名称。

下面再举一个利用二维数组生成九九乘法表的经典代码:

    1         public void multiply()
    2         {
    3             string[, ] t = new string[9, 9];
    4             string result = "";
    5             int R, C;
    6             for (int r = 0; r < 9; r++)
    7             {
    8                 result += "\n";
    9                 R = r + 1;
    10                for (int c = r; c < 9; c++)
    11                {
    12                    C = c + 1;
    13                    result += R + "*" + C + "=" + (R *C)  + " ";
    14                }
    15            }
    16            MessageBox.Show(result);
    17        }

上述代码中,第3行声明一个9行9列的二维字符串数组t,该数组每一个元素存储乘法表中每一句口诀。第5行声明了两个大写字母,用来表示乘法表中的实际数字,因为数组的下标是从0开始,而乘法表是从1开始,故此要加1。

特别注意的是代码中第10行,循环变量c是从r开始的,而不是从0开始,这样产生的乘法表将是一个上三角矩阵,而不是矩形方阵。

运行效果如图2.4所示。

图2.4 使用二维数组生成九九乘法表

遍历二维数组,就需要双层for循环才能遍历到全部元素,以下是典型的处理二维数组的代码,读者自行调试体会。

    1         public void二维数组()
    2         {
    3             int[, ] a = { { 1, 2, 3 }, { 4, 5, 6 } };
    4             result = a[0, 0] + "\t" + a[1, 2];
    5             string[, ] arr = new string[2, 4];
    6             for (int i = 0; i < 2; i++)//二维数组赋值
    7             {
    8                 for (int j = 0; j < 4; j++)
    9                 {
    10                    arr[i, j] = (i * 10 + j).ToString();
    11                }
    12            }
    13            result += arr[1, 1];
    14        }

具有同样功能的VBA代码如下:

    1  Public Sub二维数组()
    2     Dim arr(0 To 1, 0 To 3) As String
    3     Dim i As Integer, j As Integer
    4     For i = 0 To 1 '二维数组赋值
    5         For j = 0 To 3
    6             arr(i, j) = (i * 10 + j)
    7         Next j
    8     Next i
    9     result = arr(1, 1)
    10 End Sub