您好,欢迎访问三七文档
当前位置:首页 > 高等教育 > 习题/试题 > C#程序设计经典教程
1C#程序设计经典教程第六章集合、索引器与泛型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类型的集合中,并通过C#的foreach语句来访问其中的每一个对象。操作过程中MyClass的对象与Object对象之间MyClassmcObj;装箱:Objectobj=mcObj(无需显式转换)拆箱:mcObj=(MyClass)obj(事先装箱的)对象类型的集合位于System.Collections命名空间;6.1数组类Array数组是简单集合System.Array类是所有数组的基类(特殊类,不能用于派生)publicabstractclassArray:ICloneable,IList{//类体:实现了多个接口//(数组操作的常用属性和方法,多为静态)}interfaceICollection{intCount{get;}voidCopyTo(Arrayarray,intindex);boolIsSynchronized{get;}objectSynchRoot{get;}}interfaceICloneable{objectClone();}interfaceIList:Collection,IEnumerable{intAdd(objdectvalue);voidClear();boolContains(objectvalue);intIndexOf(objectvalue);voidRemove(objectkey);voidRemoveAt(intindex);voidInsert(intindex,objectvalue);…}interfaceIEnumerator{ObjectCurrent{get;}boolMoveNext();voidReset()}interfaceIEnumerable{//foreach遍历的基础IEnumeratorGetenumerator();}publicstaticvoidMain(){int[]a=newint[3];Arrayb=Array.CreateInstance(typeof(int),3);for(inti=0;i3;i++){a[I]=2*i;b.SetValue(3*i,i);}foreach(intxina)console.Write(“{0}”,x);foreach(intxinb)console.Write(“{0}”,x);}接口中的方法:默认是publicabstract的。继承接口的类:必须实现接口中的所有属性和方法,否则该类是抽象的。6.1.4栈和队列1.栈StackStack类实现了先进后出的数据结构,这种数据结构在插入或删除对象时,只能在栈顶插入或删除。创建栈对象的一般形式如下:Stack栈名=newStack();Stack类提供了栈常用操作方法,包括在栈顶添加数据、移除栈顶数据、返回栈顶数据、清空栈和检查是否包含某个数据等,方法名分别为Push、Pop、Peek、Clear和Contains。其中,Push和Pop每操作一次只能添加或删除一个数据。a1a2an…栈底栈顶出栈进栈6.1.4栈和队列2.队列QueueQueue类实现了先进先出的数据结构,这种数据结构把对象放进一个等待队列中,当插入或删除对象时,对象从队列的一端插入,从另外一端移除。队列可以用于顺序处理对象,因此队列可以按照对象插入的顺序来存储。创建队列对象的一般形式如下:Queue队列名=newQueue([队列长度][,增长因子]);其中,队列长度默认为32。增长因子默认为2.0,即每当队列容量不足时,队列长度调整为原来的2倍,可重新设置增长因子的大小。a1a2a3…an队头队尾出队入队10集合类的选择选择集合类时,一般要考虑以下问题:(1)是否需要一个序列列表,需要先进先出行为时可使用Queue队列类,在需要后进先出行为时可使用Stack栈类。(2)是否需要随机访问集合中的元素,此时不能选择Queue队列类、Stack栈类、LinkedList双向链表类(3)是否需要通过索引访问每个元素,只有ArrayList、StringCollection等是从索引为零的元素开始逐个访问集合元素。Hashtable、Dictionary通过元素的键(即元素名字)提供对元素的访问。而NameValueCollection类和SortedList泛型类通过其元素的从零开始的索引,或者通过其元素的键提供对元素的访问。(4)是否包含一个值、一个键和一个值的集合,还是一个键和多个值的集合。其中,“一个值”的集合是一种基于IList列表接口派生的集合,“一个键和一个值”的集合是一种基于IDictionary字典接口的集合,“一个键和多个值”的集合是NameValueCollection类。11集合类的选择(续)(5)是否需要用与输入元素方式不同的方式对元素排序。Hashtable按其元素的哈希代码对元素排序,SortedList以及SortedDictionary根据IComparer实现按键对元素的排序,而ArrayList提供Sort排序方法。(6)是否需要信息的快速搜索和检索,对于小集合(10个元素或更少),ListDictionary比Hashtable快,SortedDictionary泛型类提供比Dictionary泛型类更快的查找。(7)是否需要只接受字符串的集合,如StringCollection和StringDictionary等。12三、集合的创建与操作1.动态数组类ArrayList2.队列Queue3.栈Stack4.哈希表Hashtable5.字符串字典StringDictionary1.动态数组类ArrayListArrayList:可以看作是能够自动增长容量的动态数组,它实现了IList接口。(1)Capacity集合容量,读写属性(2)Count获取列表中实际包含元素的个数(3)Add()方法:列表末尾添加元素(4)Insert()方法:列表指定位置添加元素(5)Remove()方法:移除特定对象(6)RemoveAt()方法:根据索引值移除对象141.动态数组类ArrayList(1)ArrayList与Array的区别Array的大小是固定的,而ArrayList的大小可根据需要自动扩充;在Array中一次只能获取或设置一个元素的值,而在ArrayList中允许添加、插入或移除某一范围的元素;Array的下限可以自定义,而ArrayList的下限始终为零;Array可以具有多个维度,而ArrayList始终只是一维的;Array位于System命名空间中,ArrayList位于System.Collections命名空间中。(2)创建动态数组:ArrayList列表对象名=newArrayList();例如,ArrayListlist=newArrayList();list.Add(罗福强);list.Add(30);152.队列Queue队列的特点一种先进先出的数据结构,当插入或删除对象时,对象从队列的一端插入,从另外一端移除创建队列对象Queue队列名=newQueue([队列长度][,增长因子]);说明,队列长度默认为32,增长因子默认为2.0(即每当队列容量不足时,队列长度调整为原来的2倍)注意,由于调整队列的大小需要付出一定的性能代价,因此建议在构造队列时指定队列的长度。队列包括Enqueue、Dequeue、Peek、Clear和Contains等方法。其中,Enqueue和Dequeue每操作一次只能添加或删除一个数据。例如:Queueq=newQueue(50,3.0);q.Enqueue(董涛);q.Enqueue(徐磊);163.栈Stack栈的特点:一种先进后出的数据结构,这种数据结构在插入或删除对象时,只能在栈顶插入或删除。创建栈对象:Stack栈名=newStack();栈包括Push、Pop、Peek、Clear和Contain等方法。其中,Push和Pop每操作一次只能添加或删除一个数据。例如:Stacks=newStack();s.Push(成都);s.Push(四川);174.哈希表Hashtable哈希表又称散列表,表示键/值对的集合。哈希表的特点:在保存集合元素时,首先要根据键自动计算哈希代码,以确定该元素的保存位置,再把元素的值放入相应位置所指向的存储桶中。查找时,再次通过键所对应的哈希代码到特定存储桶中搜索。创建哈希表对象Hashtable哈希表名=newHashtable([哈希表长度][,增长因子]);说明,默认长度为0,默认增长因子为1.0哈希表包括Add、Remove、Clear和Contains等方法。其中,Add方法需要两个参数,一个是键,一个是值;Remove方法只需要一个键名参数。例如:Hashtableh=newHashtable();h.Add(1001,李天军);h.Add(1002,张凯);185.字符串字典StringDictionary字符串字典StringDictionary是一种把键和值强类型化为字符串而不是对象的哈希表。其中,键不能为null,且不区分大小写。例如:StringDictionarymyCol=newStringDictionary();myCol.Add(姓名,罗福强);myCol.Add(性别,男);foreach(DictionaryEntrydeinmyCol)Console.WriteLine({0}\t{1}\n,de.Key,de.Value);6.2索引器6.2.1索引器的定义与使用6.2.2索引器与属性的比较返回6.2.1索引器的定义与使用1.索引器的定义C#中的类成员可以是任意类型,包括数组或集合。当一个类包含了数组或集合成员时,索引器将大大简化对数组或集合成员的存取操作。6.2.1索引器的定义与使用定义索引器的方式与定义属性有些类似,其一般形式如下[修饰符]数据类型this[索引类型index]{get{//获得属性}set{//设置属性}}classAlbum//定义一个相册类{Photo[]photos;//该数组用于存放照片publicPhotothis[intindex]//带有int参数的Photo读/写索引器{get{if(index0||index=photos.Length)returnnull;returnphotos[index];//对于有效索引,返回请求的照片}set{if(index0||index=photos.Length)return;photos[index]=value;}}6.2.1索引器的定义与使用2.索引器的使用通过索引器可以存取类的实例的数组成员,操作方法与数组相似,一般形式如下:对象名[索引]其中,索引的数据类型必须与索引器的索引类型相同。【实例6-3】利用前面定义的索引器进行照片的添加和查询6.2.1索引器的定义与使用3.接口中的索引器在接口中也可以声明索引器,接口索引
本文标题:C#程序设计经典教程
链接地址:https://www.777doc.com/doc-4681063 .html