




已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章 数 组,数组是C#语言最常用的数据结构之一。在编程中,有时需要保存一组相同类型的数字。这时候使用数组,方便命名和调用。数组是一组类型相同的变量的集合,可以通过公共的名称来访问其中的变量。本章将给大家详细讲解使用数组进行编程的方法。,10.1 使 用 数 组,数组是一个有序的数据集合,通过数组统一访问或操作这些元素。数组中的每一个元素的数据类型都相同。元素的数据类型被称为元素类型,它可以为任何类型,甚至可以为数组。在内存中,数组占用一块连续的内存,元素按顺序存放在一起,数组中每一个单独的元素并没有自己的名字,但是可以通过其位置来进行访问或修改。下面我们来学习数组的一些基础知识。 注意:在C#语言中,数组的下标从0开始,即s0表示s数组的第一个元素。,10.1.1 数组的基准维度数,在直线、平面和空间中,称描述一个点所需要值的数量为“维度数”。数组也一样,当要描述数组中的一个元素时,如果只需要一个值(数组的下标),那么该数组的维度数为1;如果需要两个值,那么该数组的维度数为2;依次类推。根据数组的维度数不同,可以把数组分为以下3种类型。 一维数组:维度数为1的数组。 二维数组:维度数为2的数组。 多维数组:维度数大于2的数组。,10.1.2 声明数组,同类、结构一样,如果需要某一个数组,则必须首先声明该数组。声明一维数组的语法如下所示。 type arrayName; 其中,type表示数组元素的类型,如int、double、string、object等;arrayName表示数组的名称。 【示例10-1】下面声明一个数组。它的元素类型为int,名称为arr。 int arr; /声明一个int型的数组arr 【示例10-2】下面声明一个数组。它的元素类型为string,名称为arr2。 string arr2; /声明一个string型的数组arr2,10.1.3 实例化数组,数组需要分配相应的内存后才能正常存取数据。实例化数组就是为数组分配相应的内存。需要注意的是,声明一个数组,并不为该数组分配相应的内存。 【示例10-3】下面实例化数组arr,并为该数组分配相应的内存。由于arr数组的长度为10,因此该数组分配104字节的内存(该数组的元素类型为int,每一个int类型的值占4个字节)。 arr = new int10; /实例化int型的数组arr,10.1.4 初始化数组,变量可以初始化,数组也可以在定义的同时为各数组元素赋初值。初始化数组就是初始化数组中每一个元素的值,即为数组中的每一个元素进行赋值。数组被实例化之后,每个元素都为其元素类型的默认值。一般情况下,只有初始化数组之后,该数组才具有实际运算的意义。 注意:如果数组没有被初始化,那么该数组的每一个元素的值为其元素类型的默认值。如示例10-3中的arr数组的默认值为0。,初始化数组有多种方法,主要包括以下4种。 1直接赋值 直接赋值是将一组值直接赋给数组,这组值被包括在大括号之内,每一个值被逗号分隔。如果直接赋值,不指定数组长度,系统会根据元素个数自动确定。,【示例10-4】下面将一组值“today“,“is“,“a“,“sunny“,“day“”赋给s1数组。该数组初始化之后,它的长度为5,它的元素的值分别为today、is、a、sunny和day。 string s1 = “today“,“is“,“a“,“sunny“,“day“; /给string型的数组s1赋初值 注意:如果使用上述方法初始化数组,那么该数组的长度由其值(如“today“,“is“,“a“,“sunny“,“day“”)所包含单个值的数量决定。,2实例化赋值+指定长度 实例化赋值+指定长度是给数组的每个元素赋值,而且指定数组长度。如果赋值的个数超过了数组长度,那么编译器就会报错。假如数组长度为5,赋值个数为6,提示错误信息为: 应输入长度为”5”的数组初始值,【示例10-5】下面将一组值“today“,“is“,“a“,“sunny“,“day“”赋给s2数组。该初始化操作使用new操作符,并指定了数组的长度为5。该数组初始化之后,它的元素的值分别为today、is、a、sunny和day。 string s2 = new string5 “today“,“is“,“a“,“sunny“,“day“; /使用new初始化数组s2,并指定数组长度为5 注意:如果使用上述方法初始化数组,那么值(如“today“,“is“,“a“,“sunny“,“day“”)所包含单个值的数量必须等于数组的长度。,3实例化赋值+省略长度 实例化赋值+省略长度是给数组的每个元素赋值,而不指定数组长度。数组长度根据赋值的个数自动确定。,【示例10-6】下面将一组值“today“,“is“,“a“,“sunny“,“day“”赋给s3数组。该初始化操作使用new操作符,但是省略数组的长度。该数组初始化之后,它的长度为5。它的元素的值分别为today、is、a、sunny和day。 string s3 = new string“today“,“is“,“a“,“sunny“,“day“; /使用new初始化数组s3,省略数组的长度 注意:如果使用上述方法初始化数组,那么该数组的长度由其值(如“today“,“is“,“a“,“sunny“,“day“”)所包含单个值的数量决定。,4直接设置数组的每一个元素的值 【示例10-7】下面创建一个名称为s4的数组,元素类型为string,然后使用for语句直接设置s4数组的每一个元素的值。 string s4 = new string5; /创建s4数组 for(int i = 0; i 5; i+) /使用for语句直接设置s4数组的每一个元素的值 s4i = i.ToString(); 学完四种初始化数组的方式,下面我们来看个例子。该例包含了这四种初始化数组的方法。【示例】,10.1.5 遍历数组,在编程中,给数组元素赋值或者打印输出数组元素的值等,都需要遍历数组。遍历数组是指依次访问数组中的每一个元素,并执行预先设计的操作。遍历数组有两种方式:一是使用下标遍历,如for、while、dowhile等语句。二是不使用下标遍历,如foreach语句。 1使用下标遍历数组 使用下标遍历数组时,即直接通过下标来确定被访问的元素。这种方法是最常用的,也是最直接的方法。 【示例10-8】下面使用for语句遍历str数组每一个元素,并设置每一个元素的值等于该元素的下标。,2不使用下标遍历数组 有的时候,我们遍历数组时无法判断数组元素的个数,就需要使用foreach语句枚举数组中的每一个元素来实现遍历数组的功能。而且,使用foreach语句遍历数组也可以增加代码的通用性,便于处理各种长度的数组。 【示例10-9】下面使用foreach语句遍历str数组的每一个元素,并打印每一个元素的值。其中,s为临时变量,它的类型为str数组的元素类型。foreach语句将枚举str数组中的每一个元素,从而实现遍历str数组的功能。,10.2 数 组 的 类 型,前面我们介绍的示例中用的是一维数组,但数组不是只有一种。根据维度数和元素类型的不同,可将数组分为四类:一维数组、二维数组、多维数组和交错数组。本节给大家介绍各种数组的声明、实例化和初始化的方法。,10.2.1 一维数组,一维数组是指维度数为1的数组,它是一个相关变量的列表,在编程中很常见。一维数组是最简单的数组,也是最常用的数组。声明一维数组的语法如下所示。 type arrayName; 其中,type表示数组元素的类型,如int、double、string、object等;arrayName表示数组的名称。 注意:10.1节示例中的所有数组都是一维数组。,【示例10-10】下面声明一个一维数组,它的元素类型为string,名称为arr1。 string arr1; /声明string型的一维数组arr1 分析:如果要使用arr1数组,则需要实例化该数组,即为arr1数组分配相应的内存。 【示例10-11】下面实例化数组arr1,并为该数组分配10个string类型系统预定义大小的内存。 string arr1 = new string10; /实例化数组arr1 arr1数组实例化后,每个元素的值都为string类型的默认值(即空字符串)。如果要使得该数组具有实际运算意义,则还需要初始化该数组的每一个元素的值。,【示例10-12】使用for语句依次访问arr1数组中的每一个元素,并设置每一个元素的值等于它的下标组成的字符串。 for(int i = 0; i 10; i+) /使用for语句访问arr1数组的元素 arr1i = i.ToString(); /对元素进行赋值 学完一维数组的知识,我们来看个例子。【示例】下面程序中创建一个一维数组arr1,赋初值后使用foreach语句依次访问arr1数组中的每一个元素,并打印输出各数组元素。,10.2.2 二维数组,生活中,有很多事物,仅仅用一维数组,将无法恰当地被表示。二维数组是指维度数为2的数组。声明二维数组的语法如下所示。 type, arrayName; 其中,type表示数组元素的类型,如int、double、string、object等;中括号()中间存在一个逗号(,)表示该数组为一个二维数组;arrayName表示数组的名称。,【示例10-13】下面声明一个二维数组,它的元素类型为string,名称为arr2。 string, arr2; /声明一个二维数组arr2 分析:如果要使用arr2数组,和一维数组一样,则也需要实例化该数组,即为arr2数组分配相应的内存。 【示例10-14】下面实例化数组arr2,并为该数组分配相应的内存。arr2数组的维度数分别为5和10,因此该数组分配大小为“510string类型系统预定义大小”的内存。 string, arr2 = new string5,10; /实例化数组arr2 分析:arr2数组实例化后,每个元素的值都为string类型的默认值(即空字符串)。如果要使得该数组具有实际运算意义,则还需要初始化该数组的每一个元素的值。,【示例10-15】下面使用两个for语句依次访问arr2数组中的每一个元素,并设置每一个元素的值等于它的两个下标(arr2数组为二维数组,每一个元素所在的每一个维度都将存在一个下标值)组成的字符串。 for(int i = 0; i 10; i+) for(int j = 0; j 50; j+) /使用for语句访问arr2数组的元素 arr2i,j = i.ToString() + j.ToString(); /对元素进行赋值 学完二维数组的知识,我们来看个例子。【示例】下面程序中创建一个二维数组arr2,赋初值后使用双层for循环语句依次访问arr2数组中的每一个元素,并打印输出各数组元素。,10.2.3 多维数组,虽然一维数组和二维数组是编程中比较常用的数组,但有时也会用到多维数组。多维数组是指维度数大于2的数组,如三维数组、四维数组等。声明三维数组的语法如下所示。 type, , arrayName; 其中,type表示数组元素的类型,如int、double、string、object等;中括号()中间存在两个逗号(,)表示该数组为一个三维数组;arrayName表示数组的名称。,【示例10-16】下面声明一个三维数组,它的元素类型为string,名称为arr3。 string, , arr3; /声明一个三维数组arr3 分析:如果要使用arr3数组,和一维数组一样,则也需要实例化该数组,即为arr3数组分配相应的内存。 【示例10-17】下面实例化数组arr3,并为该数组分配相应的内存。arr3数组的维度数分别为5、10和50,因此该数组分配了大小为“51050string类型系统预定义大小”的内存。 string, , arr3 = new string5,10,50; /实例化三维数组arr3 分析:arr3数组实例化后,每个元素的值都为string类型的默认值(即空字符串)。如果要使得该数组具有实际运算意义,则还需要初始化该数组的每一个元素的值。,【示例10-18】下面使用3个for语句依次访问arr3数组中的每一个元素,并设置每一个元素的值等于它的3个下标(arr3数组为三维数组,每一个元素所在的每一个维度都将存在一个下标值)组成的字符串。 for(int i = 0; i 5; i+) for(int j = 0; j 10; j+) /使用for语句访问arr3数组的元素 for(int k = 0; k 50; k+) /对元素进行赋值 arr3i,j,k = i.ToString() + j.ToString()+k.ToString(); 学完多维数组的知识,我们来看个例子。【示例】下面程序中创建一个三维数组arr3,赋初值后使用三层for循环语句依次访问arr3数组中的每一个元素,并打印输出各数组元素。,10.2.4 交错数组,在上面创建二维数组时,创建的是矩形数组。如果将二维数组看作表时,矩形数组就是每行长度都相等的二维数组。但有的时候需要建立的数组是每一行长度不一样的数组,这就需要交错数组了。交错数组又称为“数组的数组”,它的元素也为一个数组,但每一行包含的列数不同。声明二维交错数组的语法如下所示。 type arrayName; 其中,type表示数组元素的类型,如int、double、string、object等;type关键字之后包含两个中括号()表示该数组为一个二维交错数组;arrayName表示数组的名称。,【示例10-19】下面声明一个二维交错数组,它的元素类型为string,名称为arr4。 string arr4; /声明一个二维交错数组arr4 分析:如果要使用arr4数组,和一维数组一样,则也需要实例化该数组,即为arr4数组分配相应的内存。,【示例10-20】下面实例化数组arr4,并为该数组分配相应的内存。arr4数组的第一维度数为10,它的每一个元素也是一个数组,它们的长度分别为1、2、3、4、5、6、7、8、9和10。 string arr4 = new string10; /声明一个二维交错数组arr4 for(int i = 0; i 10; i+) arr4i = new stringi + 1; /为第二维设定长度 分析:arr4数组实例化后,每个元素的值都为string类型的默认值(即空字符串)。如果要使得该数组具有实际运算意义,则还需要初始化该数组的每一个元素的值。,【示例10-21】下面使用2个for语句依次访问arr4数组中的每一个元素,并设置每一个元素的值等于它的2个下标(arr4数组为三维数组,每一个元素所在的每一个维度都将存在一个下标值)组成的字符串。 for(int i = 0; i 10; i+) for(int j = 0; j arr4i.Length; j+) /使用for语句访问arr4数组的元素 arr4ij = i.ToString() + j.ToString(); /对元素进行赋值 注意:示例10-21中的第二个for语句的循环次数由arr4数组中的每一个元素(也为一个数组)的长度决定。 学完交错数组的知识,我们来看个例子。【示例】下面程序中创建一个交错数组arr4,使用for循环语句依次访问arr4数组中的每一个元素,并打印输出各数组元素。,10.3 静态数组System.Array,在编程中,有的数组大小设置好以后就不能让它随意地被修改,有的又想要根据需要来设置大小。因此.NET框架提供了两种数组:静态数组和动态数组。一旦为数组分配内存之后,如果该数组的大小是不能修改的,则称该数组为静态数组;反之,则称之为动态数组。静态数组由System.Array类实现,动态数组由System.ArrayList类实现。本节将介绍静态数组的基本属性和方法,以及它们的使用方法。 注意:本章前面小节所介绍的数组都是属于静态数组。,10.3.1 常用属性概览,数组有各种特性,如数组长度、数组的秩等。为了方便用户使用类Array,微软将一些常用的属性封装到该类中。这些属性可以获取静态数组的特性。System.Array类包含7个属性,如获取数组长度的Length属性、获取数组秩的Rank等,具体如下表所示。,10.3.2 常用方法概览,在编程中,会对数组有各种各样的操作。为了方便用户使用类Array,微软还将一些常用的方法封装到该类中。调用这些方法可以执行对静态数组的操作。System.Array类包含多个方法,如获取数组长度使用GetLength()方法、获取指定元素的值使用GetValue()方法,获取指定元素的索引使用IndexOf()方法等,具体如下表所示。,【示例10-22】下面创建一个一维数组arr。该示例使用SetValue()方法设置该数组中的每一个元素的值,使用GetValue()方法获取该数组中索引值为8的元素的值,并保存为value变量。 另外,System.Array类还提供了多个与泛型(第14章)相关的方法,在此不再做介绍,读者可以参考相关资料。,10.3.3 获取数组长度,在编程中,数组的操作有时需要使用for循环,而又不确定范围,就可以先获取数组的长度。数组长度是指数组元素的总数,即数组每一维度元素数量之乘积。数组长度可以通过System.Array类的属性或者方法获取。 1通过属性获取数组的长度 通过Length和LongLength属性都可以获取数组的长度。Length属性的值为int类型,LongLength属性的值为long类型。如果数组的长度不大于32位整数,就可以使用Length属性获取;如果数组长度大于32位整数且小于64位整数,则需要通过LongLength属性来获取数组的长度。,【示例10-23】下面获取arr1数组的长度,并保留为length变量。 【示例10-24】下面获取arr2数组的长度,并保留为length变量。,2通过方法获取数组的长度 通过GetLength(int dimension)和GetLongLength(int dimension)方法都可以获取数组中指定维度的元素的数量。其中,dimension参数表示数组的维度。 【示例10-25】下面使用for语句获取arr数组每一个维度的长度,然后把这些长度相乘,结果就是arr数组的长度,并保留为length变量。 GetLength(int dimension)方法返回值为int类型,GetLongLength(int dimension)方法返回值为long类型。如果数组某一个维度的长度大于32位整数,则只能通过GetLongLength(int dimension)方法来获取数组的长度。,10.3.4 获取元素的值,有时候我们只想使用数组中某个特定的值,那么获取数组中指定元素的值最简单方法就是通过“”运算符。 【示例10-26】下面获取arr数组中第0行、第3列元素的值,并保留为value变量。 除了上述方法之外,还可以通过GetValue()方法获取指定元素的值。 【示例10-27】下面通过GetValue()方法获取arr数组中第0行、第5列元素的值,并保留为value变量。,10.3.5 设置元素的值,在编程中,有时我们只关心数组中某个元素的值。可以通过两种方式来设置指定数组元素的值:通过数组名和“”运算符或者通过SetValue()方法来设置指定元素的值。 【示例10-28】下面设置arr数组中第0行、第1列元素的值为200。 分析:本例中通过数组名和“”运算符设置arr数组第零行第一列的元素的值。,【示例10-29】下面通过SetValue()方法设置arr数组中第0行、第1列元素的值为100。 分析:本例中通过SetValue()方法设置arr数组第零行第一列的元素的值。SetValue()方法中第一个参数为元素的值,后面的参数是要设置的元素在数组中的位置的下标值。,10.3.6 获取元素的索引,有时需要得到数组中某个元素的索引值,System.Array类为一维数组提供了获取元素的索引的两个静态方法:IndexOf()和LastIndexOf()方法。IndexOf()方法获取匹配的、第一个元素的索引。LastIndexOf()方法获取匹配的、最后一个元素的索引。 【示例10-30】下面获取array数组中值为10的、第一个元素的索引值和最后一个元素的索引值,分别保存为sindex和eindex变量。 注意:IndexOf()和LastIndexOf()方法只能用于获取一维数组元素的索引值。,10.3.7 排序数组,在现实生活中,有时需要对数组元素的值进行排序,比如学生成绩按降序排列。System.Array类为一维数组提供了一个名称为“Sort()”的方法,该方法可以对一维数组中的元素进行排序。能够使用Sort()方法排序的数组中的元素必须实现IComparable接口,即数组中的元素是能够进行比较的,否则不能对该数组中的元素进行排序。,【示例10-31】下面调用Sort()方法对arr数组中的元素进行排序。 注意:Sort()方法排序算法为快速排序(QuickSort)算法。因此,Sort()方法是不稳定排序,且算法的时间复杂度为O(nlogn)。其中,n为数组的长度。,10.3.8 反转数组,有时候需要将数组中的元素反过来排列,System.Array类为一维数组提供了一个名称为Reverse()的方法。该方法可以反转一维数组中的全部元素或部分连续的元素。 【示例10-32】下面调用Reverse()方法反转arr数组中的所有元素。 【示例10-33】下面调用Reverse()方法反转array数组中的、从第3个元素开始的、连续3个元素。,10.4 动态数组System.ArrayList,在编程中,有时候需要数组长度可以改变的、存储不同数据类型的数组。动态数组的出现就解决了这种问题。动态数组又称为可变数组,且数组的长度可以动态修改。动态数组由System.ArrayList类实现,它在保存元素时,仅仅保存元素的引用,而不是元素的具体值。因此,动态数组元素的数据类型可以是任何类型,而且各个元素的数据类型也可以不相同。,【示例10-34】下面创建一个名称为myList的动态数组,并添加了4个元素。第1个元素的值为2012,数据类型为整数。第2个元素为“11月20日”,数据类型为字符串。第3个元素为A字符,数据类型为字符型。第4个元素为Program类的实例p,类型为Program。然后使用foreach语句遍历myList动态数组中的每一个元素,并打印到控制台。 注意:由于所有数据类型的基类型都是object。因此,动态数组中的所有元素都可以直接或间接地转换为object类型。所以,在遍历myList动态数组中的元素时,foreach语句使用object类型来表示myList动态数组元素的数据类型。,10.4.1 常用属性概览,动态数组有各种特性,如数组容量、数组元素的数量等。为了方便用户使用类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 散养鸡健康监测创新创业项目商业计划书
- 二建安全b证考试题库完整版2025及答案解析
- 会计从业资格证考试准备及答案解析
- 人教版八年级物理上册第五章5.1透镜及其应用-透镜说课稿
- 2025年建筑安装行业研究报告及未来行业发展趋势预测
- 2025年丙烯酸三氟乙酯行业研究报告及未来行业发展趋势预测
- 2025年AMT自动变速器行业研究报告及未来行业发展趋势预测
- 2025年干洗连锁行业研究报告及未来行业发展趋势预测
- 家具配件厂废品分类方法管理办法
- 2025年超细旦丝行业研究报告及未来行业发展趋势预测
- 第四讲-正确认识中国经济热点问题-2025秋版本-建设更高水平平安中国国家安全
- 2025北京京剧院招聘工作人员10人笔试备考题库及答案解析
- 配电柜组装基本知识培训课件
- 林业安全知识培训教育课件
- 2025年青海省事业单位招聘考试卫生类护理学专业知识试题
- Z世代对消费场所视觉对比度
- 语言认同建构机制-第1篇-洞察及研究
- 2025秋季第一学期开学典礼德育主任的发言稿:让责任与品格同行让梦想与行动齐飞
- 2025年贵州省中考物理试题及答案
- 吴伯萧名篇阅读理解与教学设计
- 仓库基础知识培训教材课件
评论
0/150
提交评论