1、如果需要使用同一类型的多个对象,就可以使用数组。数组是一种由若干个变量组成的集合,数组中包含的变量称为数组的元素,它们具有相同的数据类型。数组元素可以是任何类型,包括数组类型。数组元素的个数称为数组的长度,数组元素没有名称,只能通过索引(又称下标)来访问。在C#语言中,数组是被当作对象来实现的。在声明数组时,应先定义数组中元素的类型,其后是一个空方括号和一个变量名。C#中声明一维数组语法格式如下:数组类型数组类型 数组名;数组名;例如,下面声明了一个包含整型元素的数组:int numbers;/声明了名为声明了名为numbers的数组,元素类的数组,元素类型为型为intstring myArr
2、ay;/声明了名为声明了名为myArray的数组,元的数组,元素类型为素类型为strC#初始化数组的方法有两种:静态初始化和动态初始化。1静态初始化静态初始化如果一个数组中包含的元素不多,而且在程序设计时就已经知道这些元素的初始值,则可用静态始初化,也就是在定义数组的同时为其初始化。格式如下:数据类型数据类型 数组名数组名=元素值元素值1,元素值,元素值2,元素,元素值值n;2动态初始化动态初始化 数组动态初始化的格式如下:(1)用两个语句行实现动态初始化 数据类型数据类型 数组名数组名;数组名数组名=new 数据类型数据类型表达式表达式;(2)把定义数组变量和实例化两个步骤合在一起,用一个语
3、句行实现动态初始化 数据类型数据类型 数组名数组名=new 数据类型数据类型表达式表达式;其中表达式是指定数组长度的正整数,可以是表达式,也可以是常量。1数组元素的引用数组元素的引用数组在声明和初始化后,就可以引用数组中的元素了。数组元素的引用是通过数组名和下标来引用,引用数组元素的一般格式如下:数组名数组名索引索引 数组中的每个元素相当于一个普通变量,可以为它们赋值,也可以引用其值。在在C#中,数组元素的默认下标值是从中,数组元素的默认下标值是从0开始的。在一个拥有开始的。在一个拥有n个元素的数组个元素的数组中,首个元素的下标值为中,首个元素的下标值为0,其它元素的下标值依次加,其它元素的下
4、标值依次加1,最后一个元素的下,最后一个元素的下标值为标值为n-1。2数组元素的遍历数组元素的遍历在C#中,为了方便遍历集合中的每一个元素,提供了一种特殊的foreach语句用于构成循环。数组属于集合类型,所以也可以使用foreach语句来遍历数组中的每一个元素。语法形式如下:foreach(类型(类型 标识符标识符 in array)其中,array是被遍历的数组名,标识符是一个用于控制foreach循环的只读局部变量,仅在foreach语句中有效,它的类型应与array的类型一致。定义并且初始化二维数组的语法形式为:数据类型数据类型,数组名;数组名;也就是说,只要在方括号内加一个逗号,定义
5、的就是二维数组。依此类推,在方括号内加两个逗号,定义的就是三维数组。例如:int,a;/定义了二维整型数组定义了二维整型数组a string,b;/定义了三维字符串数组定义了三维字符串数组b 跟一维数组一样,在数组元素个数不多的情况下,也可以使用静态初始化的办法对二维数组进行初始化,但数组定义和静态初始化也必须在同一个语句内完成。例如,以下定义了一个3行3列的二维整型数组,并对其静态初始化:int,a=4,5,7,2,3,6,9,8,1 ;在C#中,所有的数组都是从.NET类库中的System.Array类派生而来的,用方括号声明数组是C#中使用Array类的记号,因而可以直接使用这个类所定义
6、的属性和方法。表4-2 Array类的常用属性属 性说 明LengthLength属性返回数组中的元素个数。如果是一个多维数组,该属性属性返回数组中的元素个数。如果是一个多维数组,该属性会返回所有阶的元素个数。如果需要确定一维中的元素个数,则可以会返回所有阶的元素个数。如果需要确定一维中的元素个数,则可以使用使用GetLength()方法方法LongLengthLength属性返回属性返回int值,而值,而LongLength属性返回属性返回long值。如果数组包值。如果数组包含的元素个数超出了含的元素个数超出了32位位int值的取值范围,就需要使用值的取值范围,就需要使用LongLength
7、属性,来获得元素个数属性,来获得元素个数Rank使用使用Rank属性可以获得数组的维数属性可以获得数组的维数Array类还包含许多静态方法,表4-3列出了常用的Array类静态方法。充分利用这些方法,可以高效率地实现数组的复制、排序、查找等操作。方法 说明 返回值类型 BinarySearch 在在一维已排序数组中搜索指定一维已排序数组中搜索指定值值 intint Clear 清除清除数组中指定范围的元素数组中指定范围的元素 void void Copy 将将源数组中指定范围的元素源数组中指定范围的元素复复制制到目标数组的指定区域到目标数组的指定区域 void void CreateInsta
8、nce 创建创建数组数组 Array Array IndexOf 一一维数组内首次出现维数组内首次出现 intint LastIndexOf 一一维数组内最后一次出现维数组内最后一次出现 long long Reverse 将将一维数组中的部分元素一维数组中的部分元素逆序逆序排列排列 intint Sort 将将指定的一维数组排序指定的一维数组排序 type type 在本章的第一节中已经介绍了利用 声明数组并对其初始化的方法,除此之外,还可以利用Array类提供的静态方法CreateInstance()创建数组对象。CreateInstance()有5种重载形式,可以创建多维数组和不基于0的
9、数组,下面仅列出一种:Array arr=Array.CreateInstance(Type type,intlength,intlowbound);其中:(1)Type type 所创建数组的数据类型(2)int length 所创建数组的维数和各个维的长度(3)int lowbound 所创建数组每个维的下标最小值 例如:int size=new int 5,7;int start=new int 1,1;Array myarray=Array.CreateInstance(typeof(double),size,start);如果事先不知道元素的类型,就可以使用该静态方法,因为类型可以作
10、为Type对象传送给CreateInstance()方法。还可以用SetValue()方法设置值,用GetValue()方法读取值。Array类提供了实现数组排序的静态方法Sort(),以及使数组元素逆向排列的静态方法Reverse()。排序方法的语法格式如下:Array.Sort(arrayname);Array.Reverse(arrayname);Sort()方法只能使一维数组按从小到大的方式排序,若希望实现从大到小的排序,可以在使用Sort()方法完成排序之后,再使用Reverse()方法逆向排序。Reverse()方法的作用是使数组中指定的部分元素按原有顺序逆向排列,而不是对它们进行
11、从小到大或从大到小的排序。Array.Copy()方法的功能是将源数组中指定范围的元素复制到目标数组的指定区域,它有4种重载形式,举例说明格式如下:Array.Copy(source,sourceIndex,distination,distinationIndex,length);其中:(1)source 源数组(2)sourceIndex 源数组中指定的起始下标(3)distination 目标数组(4)distinationIndex 目标数组中指定的起始下标(5)length 复制元素的个数 这个语句的作用是:在源数组中,从指定的下标开始,把length个元素复制到目标数组中指定下标开始
12、的区域内。C#的字符串是一个由若干个Unicode字符组成的字符数组,字符串常量使用双引号来标记,例如:中国梦就是一个字符串常量。字符串变量使用string关键字来声明,例如:string name=习近平,表示声明了一个字符串变量name。两个字符串可以通过“+”运算符来连接,例如:武汉,+每天不一样!,表示连接两个字符串,连接结果为武汉,每天不一样!。尽管字符串是引用类型,但仍然可以使用关系运算符“=”和“!=”来比较两个字符串,其实质是比较两个字符串各对应的字符是否相同。例如:设string s1=abc,s2=shz,则s1!=s2的运算结果为true。由于C#的字符串可以看成一个字符
13、数组,因此,C#允许通过索引来提取字符串中的字符。例如,string s=敢为人先,追求卓越,则执行char c=s7;字符型变量c的值为卓。System.String类实例的唯一属性是Length,语法格式如下:int x=str.Length;/str是字符串类型变量 C#中的字符串常量是建立在Unicode字符集基础之上的,它所包含的任何单个字符都由2个字节来表示。计算字符串长度时,无论中文字符、英文大小写字母、数字、标点符号,还是其它特殊符号,都按一个字符计算。从字符串str1中截取子串的SubString方法有如下两种重载方式:(1)str1.SubString(int start,
14、int length)(2)str1.SubString(int start)就是从字符串str1中start指定的位置开始,截取length参数规定的字符个数,如果省略length参数,则从start指定的位置开始,一直截取到结尾。注意start是从0开始起算的。判断一个字符串是否由指定的子串开头或结尾,查看一个字符串中是否包含另一个指定的子串,并且当这个子串存在的情况下指出其位置,可以使用如下方法:bool b1=str1.StartsWith(substr);/判断判断str1是是否由否由substr子串开头子串开头 bool b2=str2.EndsWith(substr);/判断判断
15、str2是否是否由由substr子串结尾子串结尾 int pos1=str3.IndexOf(substr);/指出指出str3中第一中第一次出现次出现substr子串的位置子串的位置 int pos2=str4.LastIndexOf(substr);/指出指出str4中中最后一次出现最后一次出现substr子串的位置子串的位置 如果字符串str3、str4中包含指定的子串,则IndexOf()和LastIndexOf()方法的返回值0;如果找不到则返回值为-1。比较两个字符串是否相等,或者比较它们的大小,可以使用以下方法:str1.CompareTo(str2)/比较字符串比较字符串str
16、1和和str2的大的大小小 str1.Equals(str2)/判断字符串判断字符串str1和和str2是否相等是否相等 其实,字符串是没有“大”、“小”之分的,这里所谓的“大”、“小”,指的是它们的Unicode编码值的大小,也可以理解成排列顺序的先后。排在前面的称为“小”,排在后面的称为“大”。在这个意义上,字母“A”小于“B”,“n”大于“m”。按照Unicode编码规则,所有大写英文字母都小于小写字母,常用汉字基本上是按汉语拼音的顺序编码的。因此,CompareTo()方法的返回值可以描述成如下的形式:1 str1小于str2 str1.CompareTo(str2)=0 str1等于str2 -1 str1大于str2 Equals()方法的返回值为布尔类型的true或false,与相等运算符(=)等价。