c#数组浅谈

来源:互联网 发布:vb combo1 编辑:程序博客网 时间:2024/05/22 15:53
数组是表示数据类型相同的一组值的数据结构,在.NET Framework中是实现在System.Array中的。以下是c#中数组的使用方式:
1.一维数组的声明方式(共有三种,以声明一个string类型的数组strings做实例来说):
(1)string[] strings = new string[n];n表示数组大小。
           string[] strings;
           strings = new string[n];这两句话与上面一句话等价;
   PS:用这种方式声明必须指出n的大小,n一般为常量,如果n要使用变量,需用const关键字进行限定,保证    其大小不会改变。

(2)string[] strings = {"Tom","Jack","July"};
   PS:这种方式直接给数组中每一个元素进行了赋值,并隐含给出了数组的大小。

(3)string[] strings = new string[n] {“Tom”,"July","Jack",......};
或者可以写为:
          string[] strings = new string[] {“Tom”,"July","Jack",......};
   PS:这种方式结合上面两种方式,即显示指定了数组的大小,又给数组中的每个元素进行了赋值。但是如果写出n,n必须    与其后赋值元素的个数相匹配。
注意,再对数组元素元素进行访问前一定要对数组元素进行初始化,在第一种声明方式中,会默认给数组的每个元素赋上相对数据类型的默认值,如int的默认值为0,stirng的默认值是“”等。
2.一维数组的常见使用方法
(1)下标访问
下标访问是对数组元素直接访问的唯一方法:
如果要访问通过以下方式声明的strings数组中的第x个元素
string[] strings = new string[n] {“Tom”,"July","Jack",......};
只需要通过strings[x-1]即可返回一个string类型的值。
1~n个元素的访问下标分别为0~n-1。
(2)遍历数组元素
遍历数组元素的方法之一是用主流语言都有的循环控制结构for活着while,其中数组的长度属性也与许多主流语言一样,是length,通过(数组名.length)即可获取。
这里要说的是c#中常使用的另一种循环方式foreach。
可以通过以下方式对如此声明string[] strings = new string[n] {“Tom”,"July","Jack",......};的数组strings进行循环打印:
foreach(string mystring in strings){
  Console.WriteLine("{0}",mystring);
}
PS:string 便是要循环访问数组元素的数据类型,strings便是要循环访问的数组名称,mystring便是循环访问中每次访问的具体元素变量的名称。
3.多维数组
(1)意义:N维数组的意义可以理解为数组中的每个元素都表示一个N维空间中点的坐标。
(2)N维数组的声明与初始化:(以四维数组来做示例)
          1.与一维数组的三种声明、初始化的方法相对应
             要声明一个int型的4维数组,声明、初始化方式如下:
             int[,,,] ints = new int[,,,];
             但是这样只是初始化只是将数组中各个元素初始化为默认int型的数字:0,那么如果我想要将其全部初 始化为1应该如何操作?假设我们要初始化一个[2,2,2,3]的int数组,先解释一下数组中所有元素的坐标问题。
             int[2,2,2,3]这个声明表示:
             这个多维数组的一维有3个元素,
                                         二维有2个元素,
                                         三维有2个元素,
                                         四维有2个元素。(越靠左边维数越高)
              那么这个数组所有元素的坐标就可以得知:
              一维3个元素的坐标为
{[0],[1],[2]}
              二维有2个元素,这两个元素都是一维的,则他们的坐标为:
{{[0,0],[0,1],[0,2]},{[1,0],[1,1],[1,2]}}
              三维有2个元素,这两个元素都是二维的,则他们的坐标为:
{{ {[0,0,0],[0,0,1],[0,0,2]},{[0,1,0],[0,1,1],[0,1,2]}},{ {[1,0,0],[1,0,1],[1,0,2]},{[1,1,0],[1,1,1],[1,1,2]}}}
              四维有2个元素,这两个元素都是三维的,测他们的坐标为:
{{ { {[0,0,0,0],[0,0,0,1],[0,0,0,2]},{[0,0,1,0],[0,0,1,1],[0,0,1,2]}},{ {[0,1,0,0],[0,1,0,1],[0,1,0,2]},{[0,1,1,0],[0,1,1,1],[0,1,1,2]}}},
{ { {[1,0,0,0],[1,0,0,1],[1,0,0,2]},{[1,0,1,0],[1,0,1,1],[1,0,1,2]}},{ {[1,1,0,0],[1,1,0,1],[1,1,0,2]},{[1,1,1,0],[1,1,1,1],[1,1,1,2]}}}}
那么如果我们要使用初始化各个元素的声明初始化方法,就需要如下声明:
 int[,,,] ints = new int[2,2,2,3]{1,1,1,};//先写一维
 int[,,,] ints = new int[2,2,2,3]{{1,1,1,},{1,1,1,}}//改为二维
 int[,,,] ints = new int[2,2,2,3]{{{1,1,1,},{1,1,1,}},{{1,1,1,},{1,1,1,}}}//改为三维
 int[,,,] ints = new int[2,2,2,3]{{{{1,1,1,},{1,1,1,}},{{1,1,1,},{1,1,1,}}},{{{1,1,1,},{1,1,1,}},{{1,1,1,},{1,1,1,}}}}//改为四维
 int[,,,] ints = new int[,,,]{{{{1,1,1,},{1,1,1,}},{{1,1,1,},{1,1,1,}}},{{{1,1,1,},{1,1,1,}},{{1,1,1,},{1,1,1,}}}}与上面一行等价
以上只是演示笔者的初始化四维数组的具体步骤,仅供参考,只有第四行代码为完整并正确的。
  (3).多维数组的直接访问与一维数组类似,都是通过下标访问。
  (4) 多维数组的便利方式与一维数组类似,需要注意的是多维数组的便利顺序是从低维到高维依次便利       的。
4.数组的数组(交错数组)
上面介绍的一维数组和多维数组都是很规则的数组。相同维数的长度都是一样的,下面介绍c#中的另一种数组,它的同一维度的长度可以不相同,就像一个2维数组,只知道有n行,每一行上面的元素个数是不一样的。
  (1)交错数组的声明、初始化
           与一维数组的声明、初始化类似,但有所不同。
          第一种方式为:
          int[][] ints = new int[2][];
          ints[0]=new int[n];
          ints[1]=new int[m];
          第二种方式:
          如果我们要声明一个3行的int型数组,我们不能使用这样的初始化方式:
          int[][] ints = {{1,2,3},{2,3},{1}};
         而应该为:
         int[][] ints = {new int[]{1,2,3},new int[]{2,3},new int[]{1}};
         第三种方式:
         不能写为:
         int[][] ints = new int[3][]{{1,2,3},{2,3},{1}};
         而应该写为:
         int[][] ints = new int[3][]{new int[]{1,2,3},new int[]{2,3},new int[]{1}};
   (2)交错数组的直接访问与一维数组类似,也是通过下标访问,不做多余解释。
   (3)交错数组的遍历时需要注意一点,如果使用这样的foreach结构
             foreach(int i in ints){},那么i并不是交错数组中具体的元素,而是交错数组的一行,如果好循环交错数组中的所有元素,应该使用这样的foreach结构:
             foreach(int[] i in ints){
                  foreach(int j in i){
                              ......
                          }
             }
需要两重foreach才行,就像用for循环遍历一个二维数组需要两重循环一样。
0 0