您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C程序设计教程第6章
2020/1/111C#程序设计经典教程第六章集合、索引器与泛型1.总体要求了解.NET类库中的集合类,初步掌握常用集合的创建和操作方法。理解索引器的概念,能区别索引器与属性,掌握索引器的定义与使用。了解泛型的相关概念,初步掌握泛型接口、泛型类、泛型属性和泛型方法的使用。2.相关知识点熟悉类和数组的定义和使用。熟悉类的方法成员的定义与使用等基本操作。3.学习重点集合、索引器、泛型的定义与使用。4.学习难点索引器的作用、定义与使用方法泛型的概念和意义,泛型的定义和使用方法第六章集合、索引器与泛型第六章集合、索引器与泛型主要内容6.1集合6.2索引器6.3泛型6.1集合6.1.1集合概述6.1.2ArrayList6.1.3哈希表Hashtable6.1.4栈和队列返回6.1.1集合概述集合是通过高度结构化的方式存储任意对象的类,与无法动态调整大小的数组相比,集合不仅能随意调整大小,而且对存储或检索存储在其中的对象提供了更多的方法。集合可以把一组类似的对象组合在一起。例如,由于Object是所有数据类型的基类,因此任何类型的对象(包括任何值类型或引用类型数据)都可被组合到一个Object类型的集合中,并通过C#的foreach语句来访问其中的每一个对象。当然,对于一个Object类型的集合来说,可能需要单独对各元素执行附加的处理,例如,装箱、拆箱或转换等.对象类型的集合位于System.Collections命名空间;集合类的功能是通过实现System.Collections命名空间中的接口而获得的。6.1.1集合概述.NETFramework提供的常用集合包括数组、列表、哈希表、字典、队列和堆栈等基本类型,还包括有序列表、双向链表和有序字典等派生集合类型。另外,.NETFramework也提供了一些专用集合用于处理特定的元素类型,包括StringCollection、StringDictionary和NameValueCollection等。其中,StringCollection是字符串集合,由若干个字符串组成。字符串集合与字符串数组的区别在于,字符串集合提供了大量的可直接调用的方法,包括Add(添加字符串)、Clear(清空集合)、Contains(是否包含特定字符串)、IndexOf(搜索特定字符串)、Insert(插入字符串)和Remove(移除特定字符串)等。6.1.2ArrayListArrayList是一个可动态维护长度的集合,它不限制元素的个数和数据类型,所以可以把任意类型的数据保存到ArrayList集合中。数组类Array与动态数组类ArrayList的主要区别如下:(1)Array的大小是固定的,而ArrayList的大小可根据需要自动扩充;(2)在Array中一次只能获取或设置一个元素的值,,而在ArrayList中允许添加、插入或移除某一范围的元素;(3)Array的下限可以自定义,而ArrayList的下限始终为零;(4)Array可以具有多个维度,而ArrayList始终只是一维的;(5)Array位于System命名空间中,ArrayList位于System.Collections命名空间中。6.1.2ArrayList1.ArrayList的初始化注意,ArrayList的容量是ArrayList对象初始可以容纳的元素数,这里的容量并不是固定的。向ArrayList添加元素时,将根据需要自动增大容量。创建动态数组对象的一般形式如下:ArrayList列表对象名=newArrayList([参数]);例如:ArrayListAlStudents=newArrayList();//创建一个拥有默认初始容量的ArrayList集合ArrayListAlTeachers=newArrayList(5);//创建一个初始容量为5的ArrayList集合6.1.2ArrayList2.ArrayList中添加元素ArrayList使用Add方法可以在集合的结尾处添加一个对象,Add方法的原型如下:intAdd(Objectvalue)//添加一个对象到集合的末尾该方法将返回添加了value处的索引值。另外,如果集合容量不足以添加新的对象,则会自动重新分配内部数组增加集合的容量,并在添加新元素之前将现有元素复制到新数组中。我们可以使用Count属性获取ArrayList中实际包含的元素数。例如:ArrayListAlStudents=newArrayList();//创建一个拥有默认初始容量的ArrayList集合Studentstu=newStudent(令狐冲,21);//创建一个Student对象6.1.2ArrayList3.访问ArrayList中的元素ArrayList集合可以通过索引来访问其中的元素,其形式为(类型)ArrayList[index]//按指定索引(下标)取得对象下面的示例通过索引访问上面添加的Student对象,并调用其ShowMsg方法。Studentstu1=(Student)AlStudents[0];stu1.ShowMsg();需要注意的是,由于ArrayList中可以添加Object类型的对象,在添加时,相当于一次装箱操作,所以在访问时,需要一次需要类型转换,把Object类型的对象转换成指定类型,这相当于一次折箱。6.1.2ArrayList4.删除ArrayList中的元素ArrayList可以通过Remove、RemoveAt和Clear方法来删除ArrayList的元素,其形式为:voidRemove(Objectobj//删除指定对象名的对象voidRemoveAt(intindex)//删除指定索引的对象voidClear()//清除集合内的所有元素下面的示例展示了通过指定对象删除对象和通过索引删除对象的方法。AlStudents.Remove(stu);//通过指定对象删除对象AlStudents.RemoveAt(1);//通过索引删除第2个(索引为1)对象6.1.2ArrayList5.向ArrayList中插入元素可以使用Insert方法将元素插入到ArrayList的指定索引处。其形式为:voidInsert(intindex,Objectvalue)//元素插入到将集合中的指定索引处在插入后,ArrayList会自动调整索引,,该元素后面元素的索引值会自动增加。下面代码说明了将stu插入到AlStudents中索引为1的位置的方法:AlStudents.Insert(1,stu);6.1.2ArrayList6.遍历ArrayList中的元素ArrayList可以使用和数组类似的方式对集合中的元素进行遍历,例如:for(inti=0;iAlStudents.Count;i++){StudentstuFor=(Student)AlStudents[i];lblShow.Text+=\n+stuFor.ShowMsg();}也可以用foreach方式进行遍历,例如:foreach(objectstuoinAlStudents){StudentstuForeach=(Student)stuo;lblShow.Text+=\n+stuForeach.ShowMsg();}6.1.2ArrayList【实例6-1】利用ArrayList进行集合的增、删、插入和遍历。6.1.3哈希表哈希表又称散列表,Hashtable类是System.Collections命名空间的类,表示键/值对的集合。在使用哈希表保存集合元素(一种健/值对)时,首先要根据键自动计算哈希代码,以确定该元素的保存位置,再把元素的值放入相应的存储位置中。查找时,再次通过键计算哈希代码,然后到相应的存储位置中搜索,这样将大大减少为查找一个元素进行比较的次数。创建哈希表对象的一般形式如下:Hashtable哈希表名=newHashtable([哈希表长度][,增长因子]);其中,如果不指定哈希表长度,则默认容量为0,当向Hashtable中添加元素时,哈希表长度通过重新分配按需自动增加。增长因子表示每调整一次增加容量多少倍,默认的增长因子为1.0。6.1.3哈希表【实例6-2】利用Hashtable进行集合的增、删和遍历。6.1.4栈和队列1.栈StackStack类实现了先进后出的数据结构,这种数据结构在插入或删除对象时,只能在栈顶插入或删除。创建栈对象的一般形式如下:Stack栈名=newStack();Stack类提供了栈常用操作方法,包括在栈顶添加数据、移除栈顶数据、返回栈顶数据、清空栈和检查是否包含某个数据等,方法名分别为Push、Pop、Peek、Clear和Contains。其中,Push和Pop每操作一次只能添加或删除一个数据。6.1.4栈和队列2.队列QueueQueue类实现了先进先出的数据结构,这种数据结构把对象放进一个等待队列中,当插入或删除对象时,对象从队列的一端插入,从另外一端移除。队列可以用于顺序处理对象,因此队列可以按照对象插入的顺序来存储。创建队列对象的一般形式如下:Queue队列名=newQueue([队列长度][,增长因子]);其中,队列长度默认为32,即允许队列最多存储32个对象。由于调整队列的大小需要付出一定的性能代价,因此建议在构造队列时指定队列的长度。增长因子默认为2.0,即每当队列容量不足时,队列长度调整为原来的2倍,可重新设置增长因子的大小。6.2索引器6.2.1索引器的定义与使用6.2.2索引器与属性的比较返回6.2.1索引器的定义与使用1.索引器的定义C#中的类成员可以是任意类型,包括数组或集合。当一个类包含了数组或集合成员时,索引器将大大简化对数组或集合成员的存取操作。6.2.1索引器的定义与使用定义索引器的方式与定义属性有些类似,其一般形式如下[修饰符]数据类型this[索引类型index]{get{//获得属性的代码}set{//设置属性的代码}}6.2.1索引器的定义与使用2.索引器的使用通过索引器可以存取类的实例的数组成员,操作方法与数组相似,一般形式如下:对象名[索引]其中,索引的数据类型必须与索引器的索引类型相同。【实例6-3】利用前面定义的索引器进行照片的添加和查询6.2.1索引器的定义与使用3.接口中的索引器在接口中也可以声明索引器,接口索引器与类索引器的区别有两个:一是接口索引器不使用修饰符;二是接口索引器只包含访问器get或set,没有实现语句。访问器的用途是指示索引器是可读写、只读还是只写的,如果是可读写的,访问器get和set均不能省略;如果是只读的,省略set访问器;如果是只写的,省略get访问器。例如:publicinterfaceIAddress{stringthis[intindex]{get;set;}//声明索引器stringAddress{get;set;}//声明属性stringAnswer();//声明方法}6.2.2索引器与属性的比较索引器与属性都是类的成员,语法上非常类似。索引器一般用在自定义的集合类中,通过使用索引器来操作集合对象就如同使用数组一样简单;而属性可用于任何自定义类,它增强了类的字段成员的灵活性。6.3泛型6.3.1泛型概述6.3.2泛型集合6.3.3泛型类、泛型方法和泛型接口返回6.3.1泛型概述利用数组来管理数据,虽然直观、容易理解,但存在很大的局限性,仍然需要重复编写几乎完全相同的代码来完成排序和查找操作。为此,C#提供了一种更加抽象的数据类型—泛型,以克服数组的不足。当利用泛型来声明这样一个更抽象的数据类型之后,再也不需要针对诸如整数、小数、字符、字符串等数据重复编写几乎完全相同的代码。具体思路如下:首先声明这种泛型数据类型,声明时不用指定要处理的数据的类型,只讨论抽象的数据操作,如排序、查找等。在实际引
本文标题:C程序设计教程第6章
链接地址:https://www.777doc.com/doc-2907600 .html