资源预览内容
第1页 / 共41页
第2页 / 共41页
第3页 / 共41页
第4页 / 共41页
第5页 / 共41页
第6页 / 共41页
第7页 / 共41页
第8页 / 共41页
第9页 / 共41页
第10页 / 共41页
亲,该文档总共41页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1,集合、索引器与泛型,集合 索引器 泛型,集合,集合概述 选择集合类 集合的创建与操作,集合概述,集合是通过高度结构化的方式存储任意对象的类,与无法动态调整大小的数组相比,集合不仅能随意调整大小,而且对存储或检索存储在其中的对象提供了更高级的方法。 NET Framework 2.0引入了泛型集合(如对象列表List)和强类型非泛型集合(字符串集合StringCollection),在使用泛型集合或非强类型非泛型集合时,要保证元素的类型是集合所需的类型。 System.Collections命名空间的ICollection接口定义了所有非泛型集合的大小和操作方法,包括添加、移除与搜索集合元素等。 System.Collections命名空间还包含了ICollection接口最常用的已实现的集合类。,选择集合类,.NET Framework的集合类 集合类的选择,.NET Framework的集合类,(1) 常用集合 (2) 位集合 包括BitArray和BitVector32 (3) 专用集合 包括StringCollection、StringDictionary和NameValueCollection等,集合类的选择,选择集合类时,一般要考虑以下问题: (1)是否需要一个序列列表,需要先进先出行为时可使用 Queue 队列类,在需要后进先出行为时可使用 Stack栈类。 (2)是否需要随机访问集合中的元素,此时不能选择Queue 队列类、Stack栈类、LinkedList 双向链表类 (3)是否需要通过索引访问每个元素,只有ArrayList、StringCollection等是从索引为零的元素开始逐个访问集合元素。Hashtable、Dictionary通过元素的键(即元素名字)提供对元素的访问。而NameValueCollection 类和SortedList 泛型类通过其元素的从零开始的索引,或者通过其元素的键提供对元素的访问。 (4)是否包含一个值、一个键和一个值的集合,还是一个键和多个值的集合。其中,“一个值”的集合是一种基于 IList 列表接口派生的集合,“一个键和一个值”的集合是一种基于IDictionary字典接口的集合,“一个键和多个值”的集合是 NameValueCollection 类。,集合类的选择(续),(5)是否需要用与输入元素方式不同的方式对元素排序。Hashtable 按其元素的哈希代码对元素排序,SortedList以及 SortedDictionary根据 IComparer 实现按键对元素的排序,而ArrayList提供 Sort 排序方法。 (6)是否需要信息的快速搜索和检索,对于小集合(10个元素或更少),ListDictionary 比 Hashtable 快,SortedDictionary 泛型类提供比 Dictionary 泛型类更快的查找。 (7)是否需要只接受字符串的集合,如StringCollection和 StringDictionary等。,集合的创建与操作,1. 动态数组类ArrayList 2. 队列Queue 3. 栈Stack 4. 哈希表Hashtable 5. 字符串字典StringDictionary 6. 键/值对集合NameValueCollection,1. 动态数组类ArrayList,(1) ArrayList与Array的区别 Array 的大小是固定的,而 ArrayList的大小可根据需要自动扩充; 在Array中一次只能获取或设置一个元素的值,而在ArrayList中允许添加、插入或移除某一范围的元素; Array 的下限可以自定义,而ArrayList的下限始终为零; Array 可以具有多个维度,而 ArrayList始终只是一维的; Array 位于 System 命名空间中,ArrayList 位于 System.Collections 命名空间中。 (2) 创建动态数组: ArrayList 列表对象名 = new ArrayList( ); 例如, ArrayList list = new ArrayList(); list.Add(“罗福强“); list.Add(30);,2. 队列Queue,队列的特点 一种先进先出的数据结构,当插入或删除对象时,对象从队列的一端插入,从另外一端移除 创建队列对象 Queue 队列名 = new Queue(队列长度,增长因子); 说明,队列长度默认为32,增长因子默认为2.0(即每当队列容量不足时,队列长度调整为原来的2倍) 注意,由于调整队列的大小需要付出一定的性能代价,因此建议在构造队列时指定队列的长度。 队列包括Enqueue、Dequeue、Peek、Clear和Contains等方法。其中,Enqueue和Dequeue每操作一次只能添加或删除一个数据。 例如: Queue q = new Queue(50,3.0); q.Enqueue(“董涛“); q.Enqueue(“徐磊“);,构造函数,Queue举例,3. 栈Stack,栈的特点: 一种先进后出的数据结构,这种数据结构在插入或删除对象时,只能在栈顶插入或删除。 创建栈对象: Stack 栈名 = new Stack( ); 栈包括Push、Pop、Peek、Clear和Contain等方法。其中,Push和Pop每操作一次只能添加或删除一个数据。 例如: Stack s = new Stack(); s.Push(“成都“); s.Push(“四川“);,构造函数,Stack举例,4. 哈希表Hashtable,哈希表又称散列表,表示键/值对的集合。(建不能为空,值可以) 哈希表的特点:在保存集合元素时,首先要根据键自动计算哈希代码,以确定该元素的保存位置,再把元素的值放入相应位置所指向的存储桶中。查找时,再次通过键所对应的哈希代码到特定存储桶中搜索。 创建哈希表对象 Hashtable 哈希表名 = new Hashtable(哈希表长度,增长因子); 说明,默认长度为0,默认增长因子为1.0 哈希表包括Add、Remove、Clear和Contains等方法。其中, Add方法需要两个参数,一个是键,一个是值;Remove方法只需要一个键名参数。 例如:Hashtable h = new Hashtable(); h.Add(1001,“李天军“); h.Add(1002,“张凯“); h1001 可得到“李天军”,构造函数,HashTable构造函数太多,不一一列举。相见CSDN帮助文档。,HashTable举例,5. 字符串字典StringDictionary,字符串字典StringDictionary是一种把键和值强类型化为字符串而不是对象的哈希表。其中,键不能为null,且不区分大小写。 例如: StringDictionary myCol = new StringDictionary(); myCol.Add( “姓名“, “罗福强“ ); myCol.Add( “性别“, “男“ ); foreach ( DictionaryEntry de in myCol ) Console.WriteLine( “0t 1n“, de.Key, de.Value );,6. 键/值对集合NameValueCollection,键/值对集合NameValueCollection表示元素为键名/键值对的集合,且元素的键名和键值均为字符串。(一个键可对应多个值) 例如: NameValueCollection myCol = new NameValueCollection(); myCol.Add( “姓名“, “罗福强“ ); myCol.Add( “性别“, “男“ ); foreach ( String s in myCol.AllKeys ) Console.WriteLine( “0t1“, s,myCols); for( int i = 0; i myCol.Count; i+ ) Console.WriteLine( “0t1“, myCol.getKey(i),myCol.get(i); 演示(源代码见帮助文档),索 引 器,索引器的定义与使用 接口中的索引器 索引器与属性的比较,索引器的定义与使用,索引器的定义 索引器的使用,索引器的定义,索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写。 一般形式如下: 修饰符 数据类型 this索引类型 index get /获得属性的代码 set /设置属性的代码 说明: 其中的数据类型是相关数组或集合的类型;索引类型表示数组或集合元素的类型;this表示操作本对象的数组或集合成员,可以简单把它理解成索引器的名字,因此索引器不能具有用户定义的名称,索引器示例,class Z /可容纳100个整数的整数集 private long arr = new long100; public long thisint index /声明索引器 get if (index = 100) return 0; else return arrindex; set if (!(index = 100) arrindex = value; ,索引器的使用,通过索引器可以存取类的实例的数组成员,操作方法与数组相似。 一般形式如下: 对象名索引 其中,索引的数据类型必须与索引器的索引类型相同。 例如,Z z = new Z(); /Z是包含索引器的类 z0 = 100; z1 = 101;,接口中的索引器,在接口中也可以声明索引器。 接口索引器与类索引器的区别有两个: 一是接口索引器不使用修饰符; 二是接口索引器只包含访问器get或set,没有实现语句。 例如:,索引器与属性的比较,泛型,一、泛型概述 二、泛型接口、泛型类及泛型方法,一、泛型概述,1. 什么是泛型 2. 为什么要引入泛型 3. .NET Framework 2.0 的泛型类,1. 什么是泛型,泛型是通过“参数化类型”来实现在同一则代码中操作多种数据类型。 泛型类型是一种编程范式,它利用“参数化类型”将类抽象化,从而实现更为灵活的复用。 泛型赋予了代码更强的安全性、更好的复用、更高的效率和更清晰的约束,2. 为什么要引入泛型,通常在讨论数组时都需要预设一个前提,即到底要解决的是整数、小数、还是字符串的运算问题。因此,在使用数组时需要首先确定数组的类型,然后再把相同类型的数据放入数组中。例如,把100个整数存入数组中,得到一个整型数组,而把100个自定义的Student对象存入数组中,得到一个对象型或Student型数组。 利用数组来管理数据,虽然直观、容易理解,但存在很大的局限性,仍然需要重复编写几乎完全相同的代码来完成排序和查找操作。为此,C#提供了一种更加抽象的数据类型泛型,以克服数组的不足。当利用泛型来声明这样一个更抽象的数据类型之后,再也不需要针对诸如整数、小数、字符、字符串等数据重复编写几乎完全相同的代码。 具体思路如下:首先声明这种泛型数据类型,声明时不用指定要处理的数据的类型,只讨论抽象的数据操作,如排序、查找等。在实际引用这种泛型数据类型时,先确定要处理的数据类型,再执行相应的操作。因此,泛型是一种“泛泛而谈”的数据类型。,3. .NET Framework 2.0 的泛型类,(1) .Net Framework提供的泛型集合类,包括List、Queue、Stack、Dictionary等,这些集合类实现了增加、删除、清除、排序和返回集合元素值的操作,且这些操作方法对任意类型的数据都有效。 (2) 列表List的使用 格式:List
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号