《C#windows编程基础.ppt》由会员分享,可在线阅读,更多相关《C#windows编程基础.ppt(41页珍藏版)》请在金锄头文库上搜索。
1、1集合、索引器与泛型集合索引器泛型集合集合概述选择集合类集合的创建与操作集合概述集合是通过高度结构化的方式存储任意对象的类,与无法动态调整大小的数组相比,集合不仅能随意调整大小,而且对存储或检索存储在其中的对象提供了更高级的方法。NETFramework2.0引入了泛型集合(如对象列表List) 和 强 类 型 非 泛 型 集 合 ( 字 符 串 集 合StringCollection),在使用泛型集合或非强类型非泛型集合时,要保证元素的类型是集合所需的类型。System.Collections命名空间的ICollection接口定义了所有非泛型集合的大小和操作方法,包括添加、移除与搜索集合元
2、素等。System.Collections命名空间还包含了ICollection接口最常用的已实现的集合类。选择集合类.NETFramework的集合类集合类的选择.NETFramework的集合类(1)常用集合(2)位集合包括BitArray和BitVector32(3)专用集合包括StringCollection、StringDictionary和NameValueCollection等集合类的选择选择集合类时,一般要考虑以下问题:(1)是否需要一个序列列表,需要先进先出行为时可使用Queue队列类,在需要后进先出行为时可使用Stack栈类。(2)是否需要随机访问集合中的元素,此时不能选择
3、Queue队列类、Stack栈类、LinkedList双向链表类(3)是否需要通过索引访问每个元素,只有ArrayList、StringCollection等是从索引为零的元素开始逐个访问集合元素。Hashtable、Dictionary通过元素的键(即元素名字)提供对元素的访问。而NameValueCollection类和SortedList泛型类通过其元素的从零开始的索引,或者通过其元素的键提供对元素的访问。(4)是否包含一个值、一个键和一个值的集合,还是一个键和多个值的集合。其中,“一个值”的集合是一种基于IList列表接口派生的集合,“一个键和一个值”的集合是一种基于IDictiona
4、ry字典接口的集合,“一个键和多个值”的集合是NameValueCollection类。集合类的选择(续)(5)是否需要用与输入元素方式不同的方式对元素排序。Hashtable按其元素的哈希代码对元素排序,SortedList以及SortedDictionary根据IComparer实现按键对元素的排序,而ArrayList提供Sort排序方法。(6)是否需要信息的快速搜索和检索,对于小集合(10个元素或更少),ListDictionary比Hashtable快,SortedDictionary泛型类提供比Dictionary泛型类更快的查找。(7)是否需要只接受字符串的集合,如StringC
5、ollection和StringDictionary等。集合的创建与操作1.动态数组类ArrayList2.队列Queue3.栈Stack4.哈希表Hashtable5.字符串字典StringDictionary6.键/值对集合NameValueCollection1.动态数组类ArrayList(1)ArrayList与Array的区别Array的大小是固定的,而ArrayList的大小可根据需要自动扩充;在Array中一次只能获取或设置一个元素的值,而在ArrayList中允许添加、插入或移除某一范围的元素;Array的下限可以自定义,而ArrayList的下限始终为零;Array可以具有
6、多个维度,而ArrayList始终只是一维的;Array位于System命名空间中,ArrayList位于System.Collections命名空间中。(2)创建动态数组:ArrayList列表对象名=newArrayList();例如,ArrayListlist=newArrayList();list.Add(罗福强);list.Add(30);2.队列Queue队列的特点一种先进先出的数据结构,当插入或删除对象时,对象从队列的一端插入,从另外一端移除创建队列对象Queue队列名=newQueue(队列长度,增长因子);说明,队列长度默认为32,增长因子默认为2.0(即每当队列容量不足时,
7、队列长度调整为原来的2倍)注意,由于调整队列的大小需要付出一定的性能代价,因此建议在构造队列时指定队列的长度。队列包括Enqueue、Dequeue、Peek、Clear和Contains等方法。其中,Enqueue和Dequeue每操作一次只能添加或删除一个数据。例如:Queueq=newQueue(50,3.0);q.Enqueue(董涛);q.Enqueue(徐磊);构造函数Queue举例3.栈Stack栈的特点:一种先进后出的数据结构,这种数据结构在插入或删除对象时,只能在栈顶插入或删除。创建栈对象:Stack栈名=newStack();栈包括Push、Pop、Peek、Clear和C
8、ontain等方法。其中,Push和Pop每操作一次只能添加或删除一个数据。例如:Stacks=newStack();s.Push(成都);s.Push(四川);构造函数Stack举例4.哈希表Hashtable哈希表又称散列表,表示键/值对的集合。(建不能为空,值可以)哈希表的特点:在保存集合元素时,首先要根据键自动计算哈希代码,以确定该元素的保存位置,再把元素的值放入相应位置所指向的存储桶中。查找时,再次通过键所对应的哈希代码到特定存储桶中搜索。创建哈希表对象Hashtable哈希表名=newHashtable(哈希表长度,增长因子);说明,默认长度为0,默认增长因子为1.0哈希表包括Ad
9、d、Remove、Clear和Contains等方法。其中,Add方法需要两个参数,一个是键,一个是值;Remove方法只需要一个键名参数。例如:Hashtableh=newHashtable();h.Add(1001,李天军);h.Add(1002,张凯);h1001可得到“李天军”构造函数HashTable构造函数太多,不一一列举。相见CSDN帮助文档。HashTable举例5.字符串字典StringDictionary字符串字典StringDictionary是一种把键和值强类型化为字符串而不是对象的哈希表。其中,键不能为null,且不区分大小写。例如:StringDictionarym
10、yCol=newStringDictionary();myCol.Add(姓名,罗福强);myCol.Add(性别,男);foreach(DictionaryEntrydeinmyCol)Console.WriteLine(0t1n,de.Key,de.Value);6.键/值对集合NameValueCollection键/值对集合NameValueCollection表示元素为键名/键值对的集合,且元素的键名和键值均为字符串。(一个键可对应多个值)例如:NameValueCollectionmyCol=newNameValueCollection();myCol.Add(姓名,罗福强);my
11、Col.Add(性别,男);foreach(StringsinmyCol.AllKeys)Console.WriteLine(0t1,s,myCols);for(inti=0;imyCol.Count;i+)Console.WriteLine(0t1,myCol.getKey(i),myCol.get(i);演示(源代码见帮助文档)索引器索引器的定义与使用接口中的索引器索引器与属性的比较索引器的定义与使用索引器的定义索引器的使用索引器的定义索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写。一般形式如下:修饰符数据类型this索引类型indexget
12、/获得属性的代码set/设置属性的代码说明:其中的数据类型是相关数组或集合的类型;索引类型表示数组或集合元素的类型;this表示操作本对象的数组或集合成员,可以简单把它理解成索引器的名字,因此索引器不能具有用户定义的名称索引器示例classZ/可容纳100个整数的整数集privatelongarr=newlong100;publiclongthisintindex/声明索引器getif(index=100)return0;elsereturnarrindex;setif(!(index=100)arrindex=value;索引器的使用通过索引器可以存取类的实例的数组成员,操作方法与数组相似。
13、一般形式如下:对象名索引其中,索引的数据类型必须与索引器的索引类型相同。例如,Zz=newZ();/Z是包含索引器的类z0=100;z1=101;接口中的索引器在接口中也可以声明索引器。接口索引器与类索引器的区别有两个:一是接口索引器不使用修饰符;二是接口索引器只包含访问器get或set,没有实现语句。例如:索引器与属性的比较泛型一、泛型概述二、泛型接口、泛型类及泛型方法一、泛型概述1.什么是泛型2.为什么要引入泛型3.NETFramework2.0的泛型类1.什么是泛型泛型是通过“参数化类型”来实现在同一则代码中操作多种数据类型。泛型类型是一种编程范式,它利用“参数化类型”将类抽象化,从而实
14、现更为灵活的复用。泛型赋予了代码更强的安全性、更好的复用、更高的效率和更清晰的约束2.为什么要引入泛型通常在讨论数组时都需要预设一个前提,即到底要解决的是整数、小数、还是字符串的运算问题。因此,在使用数组时需要首先确定数组的类型,然后再把相同类型的数据放入数组中。例如,把100个整数存入数组中,得到一个整型数组,而把100个自定义的Student对象存入数组中,得到一个对象型或Student型数组。利用数组来管理数据,虽然直观、容易理解,但存在很大的局限性,仍然需要重复编写几乎完全相同的代码来完成排序和查找操作。为此,C#提供了一种更加抽象的数据类型泛型,以克服数组的不足。当利用泛型来声明这样
15、一个更抽象的数据类型之后,再也不需要针对诸如整数、小数、字符、字符串等数据重复编写几乎完全相同的代码。具体思路如下:首先声明这种泛型数据类型,声明时不用指定要处理的数据的类型,只讨论抽象的数据操作,如排序、查找等。在实际引用这种泛型数据类型时,先确定要处理的数据类型,再执行相应的操作。因此,泛型是一种“泛泛而谈”的数据类型。3.NETFramework2.0的泛型类(1).NetFramework提供的泛型集合类,包括List、Queue、Stack、Dictionary等,这些集合类实现了增加、删除、清除、排序和返回集合元素值的操作,且这些操作方法对任意类型的数据都有效。(2)列表List的
16、使用格式:List对象名=newList();例如:Listlist=newList();list.Add(罗福强);list.Add(30);(3)字典Dictionary的使用格式:Dictionary对象名=newDictionary();例如:Dictionarydic=newDictionary();dic.Add(姓名,罗福强);dic.Add(性别,男);二、泛型接口、泛型类及泛型方法1.泛型接口2.泛型类3.泛型方法1.泛型接口(1)泛型接口通常用来为泛型集合类或者表示集合元素的泛型类定义接口。对于泛型类来说,从泛型接口派生可以避免值类型的装箱和拆箱操作。(2).NetFram
17、ework的泛型接口(3)自定义泛型接口的一般形式访问修饰符interface接口名/接口成员例如:interfaceIDate2.泛型类当一个类的操作不针对特定或具体的数据类型时,可把这个类声明为泛型类。泛型类最常用于集合,如链接列表、哈希表、堆栈、队列和树等。一般情况下,创建泛型类的过程为:从一个现有的具体类开始,逐一将每个类型更改为类型参数,一直达到通用化和可用性的最佳平衡。定义泛型类的一般形式其中,“类型参数列表”不指定数据类型,当具有多个类型参数时使用逗号分隔。“类型参数约束”用来限定泛型类所要处理的数据类型,用where关键字指定。常见的类型参数约束定义泛型类的注意事项创建自定义的
18、泛型类时,需要特别注意以下事项:(1)将哪些类型通用化为类型参数一般规则是:能够参数化的类型越多,代码就会变得越灵活,重用性就越好,但太多的通用化会使其他开发人员难以阅读或理解代码。(2)如果存在约束,应对类型参数应用什么约束一般规则是:应用尽可能最多的约束,但仍能够处理需要处理的类型。例如,如果知道泛型类仅用于引用类型,则应用类约束。这可以防止泛型类被意外地用于值类型,并允许对T使用as运算符以及检查空值。(3)是否将泛型行为分解为基类和子类由于泛型类可以作为基类使用,其注意事项与非泛型类相同3.泛型方法泛型方法是在泛型类或接口中使用类型参数声明的方法一般形式:访问修饰符返回值类型方法名(形式参数列表)/语句例如:publicstringgetInfo()/语句(源代码参见帮助文档)本章要点本章分3个专题详细介绍了C#面向对象程序设计方面的高级应用。首先介绍了集合的相关概念以及如何选择创建集合和如何操作集合的方法;然后介绍了与集合相关的索引器的概念、用法以及与属性的区别;最后介绍了泛型的概念以及如何声明泛型接口、泛型类和泛型方法。由于本章的内容都比较抽象、不易理解,为此,本章为每一个专题提供了完整的典型案例,以演示相关技术的应用。