您好,欢迎访问三七文档
1第7章数组与集合目标学习完本章之后,你应该能够掌握以下概念:数组ArrayListHashTableQueueStack引言在C#中数组和集合是两个非常重要的概念,这两种类型都可以存储多个数据,在程序中有着非常多的应用。本章将对这两种复杂数据类型进行讲述。7.1数组数组是大部分编程语言中都支持的一种数据类型,无论C语言、C++还是C#以及Java都支持数组的概念。学习过其他编程语言的读者可以快速阅读本节内容。7.1.1什么是数组数组是一组具有相同类型和名称的变量的集合,如一组整数、一组字符等。组成数组的这些变量称为数组的元素。每个数组元素都有一个编号,这个编号叫做下标,C#中的下标是从O开始的,最大的下标等于数组元素个数减一。C#中可以通过下标来区别这些元素。数组元素的个数有时也称之为数组的长度。数组类型是通过指定数组的元素类型、数组的秩(维数)和数组每个维度的上限和下限来定义的。也就是说,一个数组的定义中包含以下几个要素:元素类型数组的维数每个维数的上下限这几个要素规定了定义数组的必要条件。首先,给定类型的数组只能保存该类型的元素。其次要规定数组的维数,读者可以用几何的知识理解数组的维数,可以用一维坐标轴来理解一维数组;用平面直角坐标系来理解二维数组;用三维立体坐标系来理解三维数组等。再次,数组必须规定每个维数的大小。数组的元素表示了某一种确定的类型,如整数或字符串等,那么数组的确切含义是什么呢?数组类型的值是对象。数组对象被定义为存储数组元素类型值的一系列位置。也就是说,数组是一个存储一系列元素位置的对象。数组中存储位置的数量由数组的秩和边界来确定。数组类型从类型System.Array继承而来。System.Array类表示所有的数组,不论这些数组的元素类型或秩如何。对数组定义的操作有:根据大小和下限信息分配数组;编制数组索引以读取或写入值;计算数组元素的地址;以及查询秩、边界和数组中存储的值的总数。27.1.2数组的定义数组的定义采用以下方式:Type[]name如:int[]anIntArray;anIntArray=(1,2,3};上述代码定义了一个数组并对其进行了初始化。上述工作也可以一次完成,代码如下:int[]anIntArray={1,2,3}数组还有另外一种初始化方式,即指定数组大小并用new关键字初始化数组的元素:int[]anIntArray=newint[3];在上述代码中,.NET将会为数组中的每一个元素赋予同一个默认值。对于Int型的变量来说这个默认值是0。7.1.3数组的索引数组的索引也就是通常所说的数组下标,英文为Index。数组的索引是从0开始的。对于一个大小为门的数组来说,其索引从0开始,到n-1为止。以下代码演示了数组索弓I的用法:namespaceExample7_1{classProgram{staticvoidMain(string[]args){int[]myIntArray=newint[5];//设置数组中各个元素的值myIntArray[0]=1;myIntArray[1]=5;myIntArray[2]=10:myIntArray[3]=15:myIntArray[4]=20://使用索引依次访问数组中的元素,并输出。console.writeLine(数组中的第一个元素是{0},myIntArray[0]);3console.writeLine(数组中的第二个元素是{0},myIntArray[1]);console.writeLine(数组中的第三个元素是{0},myIntArray[2]);console.writeLine(数组中的第四个元素是{o},myIntArray[3]);console.writeLine(数组中的第五个元素是{0},myIntArray[4]);console.ReadLine();}}}代码对数组的每个元素依次赋值,并显示其内容。其运行结果如下:数组中的第一个元素是1数组中的第二个元素是5数组中的第三个元素是10数组中的第四个元素是15数组中的第五个元素是20上述代码中如果发生了如myIntArray[5]的访问方式,则会引发IndexoutofRangeException异常。这种异常的出现是显然的,由于数组中只有5个元素,其索引从0到4。因此,采用myIntArray[5]这样的访问方式等于访问一个不存在的元素。所以VisualC#2005会给出异常提示。上述讲解只涉及一维数组,其实数组可以具有多个维度。以下代码声明了一个二维数组:int[,]myArray=newint[2,2];也可以对其进行如下定义int[,]myArray={{2,4),{6,8}};同理可以声明三维等多维数组,如:int[,,]myArray=newint[2,2,2];多维数组的索引与一维数组并无太大差别,如上述二维数组中6的索引为myArray[1,0]。还有一种特殊的数组称为交错数组,这种数组的元素是数组。交错数组元素的维度和大小可以不同。交错数组有时称为“数组的数组”。如下的代码声明一个交错数组:int[][]myArray=newint[3][];此数组由3个元素构成,每个元素都是一个数组。同样,访问交错数组中的元素必须对其进行初始化:myArray[0]=newint[2];myArray[1]=newint[3];myAtray[2]=newint[4];4这几个元素即通常的数组,可以按照对一般数组的操作进行。以下代码演示了交错数组的应用:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample7_2{clasSProgram{staticvoidMain(string[]args){//定义一个包含3个数组元素的交错数组。int[][]myArray=newint[3][];//初始化所有3个数组元素。myArray[O]=newint[1]{1};myArray[1]=newint[2]{2,3};myArray[2]=newint[3]{4,5,6};//依次输出数组中的所有元素。Console.WriteLine(数组中的第一个元素是{0},myArray[0][0]);Console.WriteLine(数组中的第二个元素是{0},myArray[1][0]);Console.WriteLine(数组中的第三个元素是{0},myArray[1][1]);Console.WriteLine(数组中的第四个元素是{0},myArray[2][0]);Console.WriteLine(数组中的第五个元素是{0},myArray[2][1]);Console.WriteLine(数组中的第六个元素是{0},myArray[2][2]);Console.ReadLine();}}}该程序比较简单,其运行结果如下:数组中的第一个元素是1数组中的第二个元素是2数组中的第三个元素是35数组中的第四个元素是4数组中的第五个元素是5数组中的第六个元素是67.1.4数组的遍历读者可以从前面的小节中看到,尽管可以采用索引访问数组中的所有元素,但是这种方法还是极其烦琐和复杂的。在程序中不可能采用这种方法依次访问数组中的每个元素。这样不仅代码量非常多,编程效率也低下。针对这种问题,C#提供了foreach语句以实现数组的遍历功能。可以使用foreachl语句访问数组中的每个元素而不需要确切地知道每个元素的索引。其示例如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample7_3{classProgram{staticvoidMain(string[]args){int[]myArray=newint[5]{14,25,7,36,53);//采用foreach语句对myArray进行遍历foreach(intnumberinmyArray){Console.writeLine(number);}Console.Readline();}}}foreach语句可以方便地遍历到数组中的每一个元素,上述代码的运行结果如下1425763653以下代码实现对交错数组的遍历:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample7_4classProgramstaticVoidMain(String[]args){int[][]myArray=newint[3][];myArray[0]=newint[1]{1};myArray[1]=newint[2]{2,3};myArray[2]=newint[3]{4,5,6};//对交错数组myArray的外层数组进行遍历foreach(int[]numberinmyArray){//对交错数组myArray的内层数组进行遍历foreach(intiinnumber){Console.WriteLine(”Elementinarray:{0}”,i);}}Console.ReadLine();}}采用两次foreach遍历输出数组中的int型变量。其运行结果如下E1ementinarray:1E1ementinarray:2E1ementinarray:3E1ementinarray:4E1ementinarray:57E1ementinarray:67.1.5数组元素的清空由于数组是不可变大小的,其大小在初始化时已经确定,因此,数组元素的清空只是将部分元素设置为0、false或空,这和数组元素的类型有关。为此,C#中提供了Array.Clear方法。Array.Clear方法的定义如下:publicstaticvoidClear{Arrayarray,intindex,intlength}参数array为要进行删除操作的数组,index为要清除的一系列元素的起始索引,length为要清除的元素数。以下代码演示了Array.Clear的功能:singSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Collections:namespaceExample7_5classProgramstaticvoidMain(string[]args){int[]myArray=newint[5]{1,2,3,4,5);//输出未清空时数组的元素值。foreach(intiinmyArray){Console.WriteLine(i);}Array.Clear(myArray,1,2);//从myArray数组的l号索引元素开始清空两个元素值。//输出变化之后的结果和数组的长度。Console.WriteLine(AfterCleared:);Console.WriteLine(ThelengthofmyArrayis{O},myArray.Length);8//输出变化后数组的内容。foreach(intiinmyArray){Console.WriteLine(i);}Console.ReadLine();}}}程序运行结果如下:12345AfterCleared:ThelengthOfmyArrayis51OO45可以看到数组中第2个和第3个元素已经被赋值为0,这是因为数组元素是整型,但是数组的长度依然没有变化。7.1.6数组的查找由于数组的特性,如需查找其中的某个元素,则只能对其遍历比较。而C#为数组提供了Array.IndexOf和Array.LastlndexOf方法用于查找数组中的元素。以下代码演示了Array.IndexOf和Array.LastlndexOf方法的功能:usingsystem;usi
本文标题:第07章数组与集合
链接地址:https://www.777doc.com/doc-2241268 .html