零点起飞学C#之数组.pptx_第1页
零点起飞学C#之数组.pptx_第2页
零点起飞学C#之数组.pptx_第3页
零点起飞学C#之数组.pptx_第4页
零点起飞学C#之数组.pptx_第5页
已阅读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等,具体如下表所示。 属 性描 述 IsFixedSize表示数组的大小是否固定 IsReadOnly表示数组是否为只读 IsSynchronized表示是否同步访问 数组 Length数组的长度,即数组所有维度中元素的总数。该值为 32位整数 LongLength数组的长度,即数组所有维度中元素的总数。该值为 64位整数 Rank数组的秩,即数组的维度数 SyncRoot获取同步访问 数组的对象 10.3.2 常用方法概览 在编程中,会对数组有各种各样的操作。为了方便用户使 用类Array,微软还将一些常用的方法封装到该类中。调 用这些方法可以执行对静态数组的操作。System.Array类 包含多个方法,如获取数组长度使用GetLength()方法、获 取指定元素的值使用GetValue()方法,获取指定元素的索 引使用IndexOf()方法等,具体如下表所示。 方 法描 述 BinarySearch()使用二进制搜索算法在一维的排序数组中搜索指定元素 Clear()清空数组中的所有元素 Clone()复制数组 ConstrainedCopy()指定开始位置,并复制一系列元素到另外一个数组中 Copy()将一个数组中的一部分元素复制到另一个数组 CopyTo()将一维数组的所有元素复制到另外一个一维数组 FindIndex()搜索指定元素,并获取第一个匹配元素的索引 FindLastIndex()搜索指定元素,并获取最后一个匹配元素的索引 GetLength()获取指定维的元素数量。该值为 32位整数 GetLongLength()获取指定维的元素数量。该值为 64位整数 GetLowerBound()获取数组中指定维度的下限 GetUpperBound()获取数组中指定维度的上限 GetValue()获取指定元素的值 IndexOf()获取匹配的第一个元素的索引 LastIndexOf()获取匹配的最后一个元素的索引 Reverse()反转一维数组中元素的顺序 SetValue()设置指定元素的值 Sort()对一维数组中的元素进行排序 【示例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 常用属性概览 动态数组有各种特性,如数组容量、数组元素的数量等。 为了方便用户使用类ArrayList,微软将一些常用的属性封 装到该类中。这些属性可以获取动态数组的特性。 System.ArrayList类包含了7个属性,如获取数组元素数量 的Count属性、指示数组是否为只读的ReadOnly属性等, 具体如下表所示。 属 性描 述属 性描 述 Capacity数组的容量IsReadOnly表示数组是否为只读 Count数组元素的数量IsSynchronized表示是否同步访问 数组 IsFixedSize表示数组的大小是否固定SyncRoot获取同步访问 数组的对象 Item指定索引处的元素 10.4.2 常用方法概览 在编程中,对数组有各种各样的操作。为了方便用户使用 类ArrayList,微软还将一些常用的方法封装到该类中。调 用这些方法可以执行对动态数组的操作。System.ArrayList 类包含了多个方法,如添加新元素到数组末尾中的Add() 方法、从数组中删除指定元素的Remove()方法等,具体如 下表所示。 方 法描 述 Add()添加元素到数组的末尾 AddRange将ICollection的元素添加到数组的末尾 BinarySearch

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论